Kivy 简明教程

Kivy - Events

Kivy 是一个 Python 库,它帮助您构建跨平台 GUI 应用程序。任何 GUI 应用程序都是事件驱动的,其中程序的流程不是按顺序进行的(从上到下),而是由用户与界面上的控件的交互决定的。用户操作,如单击按钮、“从列表中选择一个项目”或“从可用的单选按钮中选择一个选项”等,称为 events

基于 GUI 的程序会预见到其环境内和周围可能发生的事件,并在发生某个事件时(如果发生)将这些事件分派到相应的处理程序函数。

kivy events

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

Global Event Dispatcher

Kivy 框架包括 EventDispatcher 类。它将事件对象分派到控件树,并且该事件通过控件层次结构传播。当某个控件能够处理该事件时,其关联的回调处理程序就会被触发。 Widget, AnimationClock 类是事件分发器的示例。

Clock 是一个全局事件分发器,可让您计划并在特定时间间隔触发事件。它定义了 'schedule_once()' 和 'schedule_interval()' 等方法,用于注册函数或方法以便在某个延迟时间后或以规则时间间隔调用。此机制对于处理定时事件、动画更新和应用程序中的其他重复任务很有用。

Example

在以下示例中,我们在控件树中放了一个标签和两个按钮。标题为“Start”的按钮计划每隔一秒定期发生一个事件。schedule_interval() 函数采用以下语法编写 -

Clock.schedule_interval(callback, timeout)

另一方面,标题为“Stop”的第二个按钮调用 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()

Output

运行以上程序。该标签最初显示“0”。单击开始按钮。该标签开始随着每秒的增加而增加其上的数字。按下“停止”按钮以取消预定事件。

kivy events

Widget Events

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

通常,在小部件的类或应用类中将事件处理程序定义为方法。它们通常以“on_”开头,后跟事件名称。例如,按钮按压事件的“on_press”。

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

Events Associated with Widgets

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

Button

  1. on_press − 按钮按下时触发。

  2. on_release − 按钮松开时触发。

  3. on_touch_down − 触摸事件在按钮上开始时触发。

  4. on_touch_up − 触摸事件在按钮上结束时触发。

TextInput

  1. on_text_validate − 用户完成文本输入编辑时触发(通过按 Enter 或 Return 触发)。

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

  3. on_text − 输入字段中的文本发生更改时触发。

CheckBox

  1. on_active − 选中或取消选中复选框时触发。

Slider

  1. on_value − 滑块的值更改时触发。

  2. on_touch_down − 在滑块上开始触摸事件时触发。

  3. on_touch_up − 在滑块上结束触摸事件时触发。

ToggleButton

  1. on_state − 在切换按钮的状态更改时触发(开启或关闭)。

  2. on_press − 在按下切换按钮时触发。

ListView

  1. on_select − 在选择列表视图中的某个项目时触发。

FileChooser

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

Switch

  1. on_active − 在切换开关开或关时触发。

Video

  1. on_load − 在视频加载完成后触发。

  2. on_play − 在视频开始播放时触发。

  3. on_pause − 视频暂停时触发。

  4. on_stop − 视频停止播放时触发。

Spinner

  1. on_text − 从微调器中选择一个项目时触发。

ActionButton

  1. on_press − 按下行动按钮时触发。

Examples − Event Handling in Kivy

当我们在 Kivy 框架中解释每个微调器时,将讨论这些事件。然而,对于本章,下面给出了两个事件处理示例。

Example 1

第一个示例显示了按钮微调器的“on_press”事件。在下面的代码中,我们有一个标签和一个按钮微调器,按 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()

Output

将以上代码另存为“demo.py”并从命令行或 Python IDE 运行它。该程序以标题显示为 0 的标签开始。每次单击按钮,标题递增 1。

kivy events start

Example 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()

Output

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

kivy events msg

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

可以使用与微调器事件类似的’trigger()' 和’on_event_name' 模式分派和处理自定义事件。