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 是一个 Python 库,可帮助您构建跨平台 GUI 应用程序。任何 GUI 应用程序都是事件驱动的,其中程序的流程不是按顺序(从上到下)的,而是由用户与界面上的小部件的交互决定的。用户操作(例如单击按钮、"从列表中选择项目"或"从可用单选按钮中选择一个选项"等)称为事件。

基于 GUI 的程序会预测其环境中可能发生的所有事件,并在发生特定事件时(如果发生)将它们分派到适当的处理程序函数。

Kivy Events

当调用 Kivy 的 App 对象的 run() 方法时,应用程序会启动"事件监听"循环并触发适当的回调函数,每种类型的事件都有一个回调函数。

全局事件分派器

Kivy 框架包含 EventDispatcher 类。它将事件对象分派到窗口小部件树,并通过窗口小部件层次结构传播事件。当窗口小部件能够处理事件时,将触发其关联的回调处理程序。 Widget、Animation 和 Clock 类是事件调度程序的示例。

Clock 是一个全局事件调度程序,允许您以特定间隔安排和触发事件。它定义了诸如"schedule_once()"和"schedule_interval()"之类的方法来注册要在一定延迟后或定期调用的函数或方法。此机制对于处理应用中的定时事件、动画更新和其他重复任务非常有用。

示例

在下面的示例中,我们在小部件树中放置了一个标签和两个按钮。标题为"开始"的按钮安排事件每隔一秒定期发生。 schedule_interval() 函数使用以下语法编写 −

Clock.schedule_interval(callback, ti​​meout)

另一方面,标题为"停止"的第二个按钮调用 unscheduled() 方法,该方法删除了预定的事件。

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.config import Config

# Configuration
Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', '1')

class DemoApp(App):
   def build(self):
      lo = BoxLayout(orientation='vertical')
      self.l1 = Label(text="0", font_size=100)
      self.b1 = Button(text="start", font_size=100, color=(0, 0, 1, 1))
      
      self.b1.bind(on_press=self.onstart)
      self.b2 = Button(text="Stop", font_size=100, color=(1, 0, 0, 1))
      self.b2.bind(on_press=self.onstop)
      lo.add_widget(self.l1)
      lo.add_widget(self.b1)
      lo.add_widget(self.b2)
      return lo

   def onstart(self, event):
      print("started")
      Clock.schedule_interval(self.update_label, 1)

   def onstop(self, event):
      Clock.unschedule(self.update_label)

   def update_label(self, event):
      self.l1.text = str(int(self.l1.text) + 1)

if __name__ == '__main__':
   DemoApp().run()

输出

运行上述程序。标签最初显示"0"。单击"开始"按钮。标签上的数字开始每秒增加一次。按"停止"按钮取消安排事件。

Kivy Events

Widget Events

大多数 Kivy 小部件都具有内置事件处理功能。事实上,每个小部件都旨在处理特定类型的事件。例如,Button 小部件处理单击它引起的事件。您可以为小部件上发生的特定事件注册事件处理程序,例如按钮单击、触摸事件或键盘事件。

通常,事件处理程序被定义为小部件类或 App 类中的方法。它们通常以"on_"为前缀,后跟事件的名称。例如,按钮按下事件的"on_press"。

当事件发生时,Kivy 会自动调用相应的事件处理程序方法,并将有关事件的相关信息作为参数传递。在事件处理程序中,您可以定义要执行的所需行为或操作。

与小部件关联的事件

下面给出了与一些最常用的小部件关联的事件列表 −

Button

  • on_press − 按下按钮时触发。

  • on_release − 释放按钮时触发。

  • on_touch_down −当按钮上开始触摸事件时触发。

  • on_touch_up − 当按钮上结束触摸事件时触发。

TextInput

  • on_text_validate − 当用户完成编辑文本输入(按 Enter 或 Return 键)时触发。

  • on_focus − 当文本输入获得或失去焦点时触发。

  • on_text − 每当输入字段中的文本发生变化时触发。

CheckBox

  • on_active − 当复选框被选中或取消选中时触发。

滑块

  • on_value − 当滑块的值改变时触发。

  • on_touch_down − 当滑块上的触摸事件开始时触发。

  • on_touch_up − 当滑块上的触摸事件结束时触发。

ToggleButton

  • on_state −当切换按钮的状态改变(打开或关闭)时触发。

  • on_press − 当按下切换按钮时触发。

ListView

  • on_select − 当选择列表视图中的项目时触发。

FileChooser

  • on_selection − 当在文件选择器中选择文件或目录时触发。

Switch

  • on_active −当开关打开或关闭时触发。

Video

  • on_load − 当视频完成加载时触发。

  • on_play − 当视频开始播放时触发。

  • on_pause − 当视频暂停时触发。

  • on_stop − 当视频停止播放时触发。

Spinner

  • on_text − 当从微调器中选择项目时触发。

ActionButton

  • on_press − 当按下操作按钮时触发。

示例 − Kivy 中的事件处理

当我们解释 Kivy 框架中的每个小部件时,将讨论这些事件。但是,在本章中,这里给出了两个事件处理示例。

示例 1

第一个示例显示了 Button 小部件的"on_press"事件。在下面的代码中,我们有一个 Label 和一个 Button 小部件,它们排列在 BoxLayout 中。为了处理 on_press 事件,我们将按钮与 DemoApp 类中定义的 onstart() 方法绑定

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.config import Config

# Configuration
Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', '1')

class DemoApp(App):
   def build(self):
      lo = BoxLayout(orientation='vertical')
      self.l1 = Label(text="0", font_size=100)
      self.b1 = Button(text = "start", font_size = 100, color=(1,0,0,1))
      self.b1.bind(on_press=self.onstart)
      lo.add_widget(self.l1)
      lo.add_widget(self.b1)
      return lo

   def onstart(self, event):
      print ("started")
      self.l1.text = str(int(self.l1.text)+1)

if __name__ == '__main__':
   DemoApp().run()

输出

将上述代码保存为"demo.py",并从命令行或 Python IDE 运行。程序以标签显示 0 作为其标题开始。每次单击按钮时,标题都会增加 1。

Kivy Events Start

示例 2

在此示例中,我们有一个 TextInput 小部件和一个标签。TextInput 绑定到 onkey() 方法。用户的每个击键输入都会反映在标签上。

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout

from kivy.clock import Clock
from kivy.core.window import Window

Window.size = (720,400)

class DemoApp(App):
   def build(self):
      lo = BoxLayout(orientation='vertical')
      self.t1 = TextInput(multiline=False)
      self.l1 = Label(font_size=50)
      self.t1.bind(text=self.onkey)

      lo.add_widget(self.t1)
      lo.add_widget(self.l1)
      return lo
      
   def onkey(self, event, value):
      print ("press")
      self.l1.text = value

if __name__ == '__main__':
   DemoApp().run()

输出

运行程序并在文本框中输入一些文本。输入时,标签标题会更新。

Kivy Events Msg

还可以定义自定义事件和事件处理程序来处理特定于应用程序的事件。为此,您需要对"EventDispatcher"类进行子类化并定义所需的属性和方法。

可以使用类似于小部件事件的"trigger()"和"on_event_name"模式来调度和处理自定义事件。