Kivy - 时钟
Kivy 框架中的 Clock 对象是一个全局事件调度程序。它用于以特定间隔安排和触发事件。要安排事件重复发生或一次性发生,它绑定到回调函数。您可以通过"dt"参数(即增量时间)获取调度和调用回调之间的时间间隔。
Clock 对象在"kivy.clock"模块中定义。它由"schedule_once()"和"schedule_interval()"等方法组成,用于注册要在一定延迟后或定期调用的函数或方法。此机制可用于处理应用中的定时事件、动画更新和其他重复任务。
函数"schedule_interval()"和"schedule_once()"都有两个参数;回调和以秒为单位的时间间隔。
from kivy.clock import Clock def clock_callback(dt): "Clock event occurred" # 每 2 秒调用一次 clock_callback Clock.schedule_interval(clock_callback, 2) # 每 5 秒调用一次 clock_callback Clock.schedule_once(clock_callback, 5)
timeout dt 参数的默认值为 0。因此,为了尽早调用回调函数,请将第二个参数设置为计划事件为 0,或者不使用该参数来使用默认值。
Clock.schedule_once(my_callback)
使用"-1"的超时会导致事件在下一帧之前发生,而将其设置为 0 会导致事件在下一帧之后发生。
触发的事件
Clock 对象可以使用以下函数触发时钟事件 −
schedule_interval(callback, timeout) − 此函数安排每隔指定秒调用一次事件。该函数返回一个 ClockEvent 对象。在返回的事件上调用 ClockEvent.cancel() 取消安排事件。
schedule_once(callback, timeout=0) − 此函数安排事件在指定的秒数内一次性执行,并返回 ClockEvent 对象。如果未指定 timeout 或为 0,则在渲染下一帧后调用回调。要取消事件,请在返回的事件上调用 ClockEvent.cancel()。
create_trigger(callback, timeout=0) − 此函数创建一个触发事件。与其他两个函数不同,事件不会自动安排,您需要调用它。与其他两个函数一样,在执行事件之前,通过调用 ClockEvent.cancel() 取消事件。要再次安排它,只需调用事件 (event())。
create_trigger() 函数具有以下参数 −
callback − 要执行的回调。来自 kivy。它需要一个 timeout 参数来指定在调用回调之前要等待多长时间。
interval − 一个 bool 参数指示是否应调用一次 (False) 或重复调用回调。
from kivy.clock import Clock def clock_callback(dt): "Clock event occurred" triggerevent = Clock.create_trigger(clock_callback, 5) triggerevent()
要取消通过上述任一方式创建的事件,请使用 event.cancel() 或 event.unschedule() 方法。
示例
以下代码在 Kivy 应用程序窗口上运行倒计时器。"kv"脚本将 TextInput 框、标签和按钮放在一列网格布局中。
<clockwidget>: GridLayout: cols:1 size:root.size TextInput : font_size : '30pt' id:t1 halign:'center' valign:'center' Label: id: l1 text : 'Current Value: ' font_size : '20pt' Button : id:b1 text : 'Start Countdown' font_size:20
布局类clockwidget继承自GridLayout,并将命令按钮绑定到一种方法,该方法安排一个周期性事件在每一秒后发生。
每次调用回调时,标签都会显示递减的数字,从用户在文本框中输入的值开始。当它达到0时,该事件将被其cancel()方法取消安排。
class clockwidget(GridLayout): def __init__(self, *args): super(*args).__init__() self.ids.b1.bind(on_press=self.showtime) def countdown(self, dt): if self.val==0: self.ids.l1.text="Countdown Stopped" self.ids.l1.color=[1,0,0] self.ev.cancel() self.ids.b1.disabled=False else: self.ids.l1.text="Current Value: {}".format(self.val) self.ids.l1.color=[1,1,1] self.val=self.val-1 def showtime(self, *args): self.val=int(self.ids.t1.text) self.ev=Clock.schedule_interval(self.countdown, 1) self.ids.b1.disabled=True
本练习的完整代码如下 −
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.clock import Clock from kivy.core.window import Window Window.size = (720, 400) class clockwidget(GridLayout): def __init__(self, *args): super(*args).__init__() self.ids.b1.bind(on_press=self.showtime) def countdown(self, dt): if self.val == 0: self.ids.l1.text = "Countdown Stopped" self.ids.l1.color = [1, 0, 0] self.ev.cancel() self.ids.b1.disabled = False else: self.ids.l1.text = "Current Value: {}".format(self.val) self.ids.l1.color = [1, 1, 1] self.val = self.val - 1 def showtime(self, *args): self.val = int(self.ids.t1.text) self.ev = Clock.schedule_interval(self.countdown, 1) self.ids.b1.disabled = True class clockdemoapp(App): def build(self): w = clockwidget() w.cols = 1 return w clockdemoapp().run()
输出
当您运行此程序时,它将显示以下应用程序窗口。 输入倒计时器的值,然后单击"开始"按钮。
标签开始更新,减少倒计时值的数量。
当它达到"0"时,按钮将再次启用。