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