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、AnimationClock 类是事件调度程序的示例。

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"模式来调度和处理自定义事件。