Kivy 简明教程
Kivy - Events
Kivy 是一个 Python 库,它帮助您构建跨平台 GUI 应用程序。任何 GUI 应用程序都是事件驱动的,其中程序的流程不是按顺序进行的(从上到下),而是由用户与界面上的控件的交互决定的。用户操作,如单击按钮、“从列表中选择一个项目”或“从可用的单选按钮中选择一个选项”等,称为 events 。
基于 GUI 的程序会预见到其环境内和周围可能发生的事件,并在发生某个事件时(如果发生)将这些事件分派到相应的处理程序函数。
当调用 Kivy 的 App 对象的 run() 方法时,应用程序会启动“事件侦听”循环,并针对每种类型的事件触发适当的回调函数,每个函数对应一种事件。
Global Event Dispatcher
Kivy 框架包括 EventDispatcher 类。它将事件对象分派到控件树,并且该事件通过控件层次结构传播。当某个控件能够处理该事件时,其关联的回调处理程序就会被触发。 Widget, Animation 和 Clock 类是事件分发器的示例。
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()
Widget Events
Kivy 构建的大多数小部件都具有内置的事件处理功能。事实上,每个小部件都被设计为处理特定类型的事件。例如,按钮小部件处理由单击它而引起的事件。您可以为小部件上发生的特定事件(例如,按钮单击、触摸事件或键盘事件)注册事件处理程序。
通常,在小部件的类或应用类中将事件处理程序定义为方法。它们通常以“on_”开头,后跟事件名称。例如,按钮按压事件的“on_press”。
当事件发生时,Kivy 会自动调用相应的事件处理程序方法,并将事件相关信息作为参数传递。在事件处理程序中,您可以定义要执行的所需行为或操作。
Events Associated with Widgets
下面列出了与一些最常用的部件相关联的事件列表 −
Button
-
on_press − 按钮按下时触发。
-
on_release − 按钮松开时触发。
-
on_touch_down − 触摸事件在按钮上开始时触发。
-
on_touch_up − 触摸事件在按钮上结束时触发。
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()
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()