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 ScrollView 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 VKeyboard 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 Atlas Kivy 数据加载器 Kivy 缓存管理器 Kivy 控制台 Kivy 动画 Kivy MultiStroke Kivy 时钟 Kivy SVG Kivy UrlRequest Kivy 剪贴板 Kivy 工厂 Kivy 手势 Kivy 语言 Kivy 图形 Kivy 绘图 Kivy 打包 Kivy Garden Kivy 存储 Kivy 矢量 Kivy Utils Kivy Inspector 工具 Kivy 工具 Kivy 日志 Kivy 帧缓冲区

Kivy 应用程序和项目

Kivy 绘图应用程序 Kivy 计算器应用程序 Kivy 秒表应用程序 Kivy 相机处理 Kivy 图像查看器 Kivy 贝塞尔曲线 Kivy 画布应力 Kivy 圆形绘制 Kivy 小部件动画 Kivy 杂项

Kivy - 输入

Kivy 框架能够接收和处理来自鼠标、触摸屏、陀螺仪、加速度计等不同类型的输入。大多数情况下,Kivy 会自动检测可用的硬件。但是,如果您想支持自定义硬件,则需要相应地配置 kivy。

不同输入源生成的所有事件都由相应的事件类表示。MotionEvent 是用于指点设备提供的事件(触摸和非触摸事件)的基类。

  • 触摸事件 − 至少包含 X 和 Y 位置的运动事件。所有触摸事件都通过 Widget 树进行分派。

  • 无触摸事件 − 非触摸事件的一个例子是加速度计,因为它是一个连续事件,没有位置。它永远不会启动或停止。这些事件不会在 Widget 树中分派。

Kivy 对输入进行后处理并对其进行分析,以做出有意义的解释,例如 −

  • 是否为双击/三击检测?(根据距离和时间阈值)

  • 当硬件不准确时使事件更准确

  • 如果原生触摸硬件发送的事件位置几乎相同,则减少生成的事件数量

处理后,运动事件将分派到窗口。如果它只是一个运动事件,它将被分派到 on_motion()。另一方面,如果是触摸事件,则触摸的 (x,y) 位置(0-1 范围)将缩放到窗口大小(宽度/高度),并分派到 −

  • 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']

Or,

['pos', 'angle']

配置文件值

以下是默认支持的一些配置文件值。

Sr.No 配置文件值和说明
1 角度

2D 角度。通过"a"属性访问。

2 按钮

鼠标按钮("左"、"右"、"中"、"向上滚动"或"向下滚动")。通过按钮属性访问。

3 Markerid

标记或基准 ID。通过 fid 属性访问。

4 Pos

2D 位置。通过 x、y 或 pos 属性访问。

5 pos3d

3D 位置。通过 x、y 或 z 属性访问。

6 Pressure

接触压力。通过 pressure 属性访问。

7 Shape

接触形状。通过 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