- Kivy 教程
- Kivy - 首页
- Kivy 基础
- Kivy - 入门
- Kivy - 安装
- Kivy - 架构
- Kivy - 文件语法
- Kivy - 应用
- Kivy - Hello World
- Kivy - 应用生命周期
- Kivy - 事件
- Kivy - 属性
- Kivy - 输入
- Kivy - 行为
- Kivy 按钮
- Kivy - 按钮
- Kivy - 按钮事件
- Kivy - 按钮颜色
- Kivy - 按钮大小
- Kivy - 按钮位置
- Kivy - 圆形按钮
- Kivy - 禁用按钮
- Kivy - 图片按钮
- Kivy 组件
- Kivy - 组件
- Kivy - 标签
- Kivy - 文本输入
- Kivy - 画布
- Kivy - 线
- Kivy - 复选框
- Kivy - 下拉列表
- Kivy - 窗口
- Kivy - 滚动视图
- Kivy - 走马灯
- Kivy - 滑块
- Kivy - 图片
- Kivy - 弹出窗口
- Kivy - 开关
- Kivy - 微调器
- Kivy - 分隔器
- Kivy - 进度条
- Kivy - 气泡
- Kivy - 标签页面板
- Kivy - 散点图
- Kivy - 手风琴
- Kivy - 文件选择器
- Kivy - 颜色选择器
- Kivy - 代码输入
- Kivy - 模态视图
- Kivy - 切换按钮
- Kivy - 摄像头
- Kivy - 树形视图
- Kivy - reStructuredText
- Kivy - 操作栏
- Kivy - 播放器
- Kivy - 模板视图
- Kivy - 虚拟键盘
- Kivy - 触摸涟漪
- Kivy - 音频
- Kivy - 视频
- Kivy - 拼写检查
- Kivy - 效果
- Kivy - 输入录制器
- Kivy - OpenGL
- Kivy - 文本
- Kivy - 文本标记
- Kivy - 设置
- Kivy 布局
- Kivy - 布局
- Kivy - 浮动布局
- Kivy - 网格布局
- Kivy - 箱式布局
- Kivy - 堆叠布局
- Kivy - 锚点布局
- Kivy - 相对布局
- Kivy - 页面布局
- Kivy - 回收布局
- Kivy - 布局嵌套
- Kivy 高级概念
- Kivy - 配置对象
- Kivy - 图集
- Kivy - 数据加载器
- Kivy - 缓存管理器
- Kivy - 控制台
- Kivy - 动画
- Kivy - 多笔画
- Kivy - 时钟
- Kivy - SVG
- Kivy - UrlRequest
- Kivy - 剪贴板
- Kivy - 工厂
- Kivy - 手势
- Kivy - 语言
- Kivy - 图形
- Kivy - 绘制
- Kivy - 打包
- Kivy - Garden
- Kivy - 存储
- Kivy - 矢量
- Kivy - 工具
- Kivy - 检查器
- Kivy - 工具
- Kivy - 日志记录器
- Kivy - 帧缓冲区
- Kivy 应用和项目
- Kivy - 绘图应用
- Kivy - 计算器应用
- Kivy - 计时器应用
- Kivy - 摄像头处理
- Kivy - 图片查看器
- Kivy - 贝塞尔曲线
- Kivy - 画布压力测试
- Kivy - 圆形绘制
- Kivy - 组件动画
- Kivy - 其他
- Kivy 有用资源
- Kivy - 快速指南
- Kivy - 有用资源
- Kivy - 讨论
Kivy - 输入
Kivy 框架能够接收和处理来自鼠标、触摸屏、陀螺仪、加速度计等不同类型的输入。大多数情况下,Kivy 会自动检测可用的硬件。但是,如果您想支持自定义硬件,则需要相应地配置 kivy。
不同输入源生成的事件都由相应的事件类表示。MotionEvent 是用于指向设备(触摸和非触摸事件)提供的事件的基本类。
触摸事件 - 包含至少 X 和 Y 位置的运动事件。所有触摸事件都分发到 Widget 树中。
非触摸事件 - 加速度计就是一个非触摸事件的例子,因为它是一个连续的事件,没有位置。它永远不会开始或停止。这些事件不会分发到 Widget 树中。
Kivy 对输入应用后处理并进行分析,以做出有意义的解释,例如:
是否为双击/三击检测?(根据距离和时间阈值)
当硬件不准确时使事件更准确
如果本机触摸硬件发送的事件位置几乎相同,则减少生成的事件数量
处理后,运动事件将分发到 Window。如果它只是一个运动事件,它将分发到 on_motion()。另一方面,如果它是触摸事件,触摸的 (x,y) 位置(0-1 范围)将按比例缩放为 Window 大小(宽度/高度),并分发到:
- on_touch_down()
- on_touch_move()
- on_touch_up()
示例
在下面的示例中,我们定义了一个名为 widget 的新类,它继承自 Widget。我们需要使用以下语句导入 Widget 类:
from kivy.uix.widget import Widget
widget 类中有三个方法:
on_touch_down - 初始按下。
on_touch_move - 在按下并移动过程中发生的移动。
on_touch_up - 按下“释放”。
class widget(Widget): def on_touch_down(self, touch): print("Down:",touch) def on_touch_move(self, touch): print("Move:",touch) def on_touch_up(self, touch): print("UP!",touch)
接下来,App 类的 build() 方法返回 widget() 对象。
class MotionApp(App): def build(self): return widget()
您可以通过在屏幕上单击并拖动来测试代码。您应该看到鼠标的所有移动和按压位置。
以下是完整代码。您可以保存并运行它:
from kivy.app import App from kivy.uix.widget import Widget from kivy.config import Config # Configuration Config.set('graphics', 'width', '720') Config.set('graphics', 'height', '400') Config.set('graphics', 'resizable', '1') class widget(Widget): def on_touch_down(self, touch): print("Down:",touch) def on_touch_move(self, touch): print("Move:",touch) def on_touch_up(self, touch): print("UP!",touch) class MotionApp(App): def build(self): return widget() if __name__ == '__main__': MotionApp().run()
输出
输出是一个空的应用程序窗口,其中没有任何 UI 组件。
在窗口中的任何位置单击鼠标。将捕获“on_touch_down”和“on_touch_up”事件,显示鼠标触摸的位置,如下所示:
Down: <MouseMotionEvent spos=(0.4228094575799722, 0.38596491228070173) pos=(304.0, 154.0)> UP! <MouseMotionEvent spos=(0.4228094575799722, 0.38596491228070173) pos=(304.0, 154.0)> Down: <MouseMotionEvent spos=(0.5730180806675939, 0.5137844611528822) pos=(412.0, 205.0)> UP! <MouseMotionEvent spos=(0.5730180806675939, 0.5137844611528822) pos=(412.0, 205.0)> Down: <MouseMotionEvent spos=(0.2517385257301808, 0.5588972431077694) pos=(181.0, 223.0)> UP! <MouseMotionEvent spos=(0.2517385257301808, 0.5588972431077694) pos=(181.0, 223.0)>
MouseMotionEvent 的spos属性在 0-1 坐标系中提供相对位置。应用程序窗口的左下角对应于 (0,0),右上角对应于 (1,1)。
pos属性显示鼠标单击的实际坐标。在上面的示例中,它相对于 (0,0) 位置向右 378.85 像素,向上 281.39 像素。
按住鼠标并将其移动到窗口中,您将获得 spos 和 pos 属性的瞬时变化值。例如:
Move: <MouseMotionEvent spos=(0.41863699582753827, 0.5338345864661654) pos=(376.3546592489569, 266.38345864661653)> Move: <MouseMotionEvent spos=(0.4172461752433936, 0.531328320802005) pos=(375.1043115438108, 265.1328320802005)> Move: <MouseMotionEvent spos=(0.41585535465924894, 0.5288220551378446) pos=(373.8539638386648, 263.88220551378447)>
事件配置文件
根据输入提供程序和正在使用的硬件类型,事件配置文件包含有关输入事件的更多信息。该配置文件是 MotionEvent 对象的设备特定属性。例如,触摸输入具有 (x,y) 位置,但可能还具有压力信息、斑点大小、加速度矢量等。
通过在 touch_down 事件处理程序中添加以下语句,我们可以找出当前设备支持的功能。
def on_touch_down(self, touch): print(touch.profile)
输出将取决于设备类型。它可能是:
['pos', 'button']
或者,
['pos', 'angle']
配置文件值
以下是默认支持的一些配置文件值。
序号 | 配置文件值和说明 |
---|---|
1 | 角度 2D 角度。通过“a”属性访问。 |
2 | 按钮 鼠标按钮('left'、'right'、'middle'、'scrollup' 或 'scrolldown')。通过 button 属性访问。 |
3 | 标记 ID 标记或基准 ID。通过 fid 属性访问。 |
4 | 位置 2D 位置。通过 x、y 或 pos 属性访问。 |
5 | 3D 位置 3D 位置。通过 x、y 或 z 属性访问。 |
6 | 压力 接触压力。通过 pressure 属性访问。 |
7 | 形状 接触形状。通过 shape 属性访问。 |
触摸形状
在 Kivy 中,触摸事件期间的交互区域由术语“触摸形状”表示。它指的是用于表示屏幕上触摸或触摸事件的几何形状。如果触摸有形状,它将反映在“shape”属性中。
Kivy 支持不同的触摸形状,包括椭圆形、矩形、圆形和正方形。
双击/三击
在多点触控设备的上下文中,双击是在规定的时间和距离内两次点击的操作。同样,设备可以识别“三击”操作。
事件对象具有“is_double_tap”属性以及“is_triple_tap”属性,两者都计算为 True 或 False。您可以测试当前触摸是否为双击之一:
def on_touch_down(self, touch): if touch.is_double_tap: print('Touch is a double tap!') print(' - interval is', touch.double_tap_time) print(' - distance between previous is', touch.double_tap_distance)
快速连续按下鼠标按钮两次。您可能会获得类似于以下所示的结果:
Touch is a double tap! - interval is 0.17462420463562012 - distance between previous is 0.0