Kivy 简明教程
Kivy - Clock
Kivy 框架中的时钟对象是全局事件分发程序。它用于在指定时间间隔计划和触发事件。要计划一次性或重复发生的事件,它会被绑定到回调函数中。您可以通过 “dt”参数(增量时间)来获取计划事件和回调函数调用之间的耗时。
时钟对象在 “kivy.clock” 模块中进行定义。它包含诸如 “schedule_once()” 和 “schedule_interval()” 等方法来注册将在一定延迟后或在规则时间间隔执行的函数或方法。此机制可用于处理定时事件、动画更新以及应用程序中的其他重复任务。
“schedule_interval()” 和 “schedule_once()” 函数都有两个参数;回调和时间间隔(秒)。
from kivy.clock import Clock
def clock_callback(dt):
"Clock event occurred"
# call clock_callback every 2 seconds
Clock.schedule_interval(clock_callback, 2)
# call clock_callback in 5 seconds
Clock.schedule_once(clock_callback, 5)
超时 dt 参数的默认值为 0. 因此,为了在尽可能短的时间内调用回调函数,请将第二个参数设定为 0,或者不提供此参数来使用默认值。
Clock.schedule_once(my_callback)
使用超时时间“-1”会让事件在下一帧之前发生,而将其设置为 0 会让事件在下一帧之后发生。
Triggered Events
Clock 对象可以通过使用以下函数触发一个时钟事件 −
-
schedule_interval(callback, timeout) − 这个函数安排了一个事件,让它在指定的秒数之后被调用。该函数返回一个 ClockEvent 对象。要取消安排好的事件,请在返回的事件上调用 ClockEvent.cancel()。
-
schedule_once(callback, timeout=0) − 这个函数安排了一个事件,让它在指定的秒数之后执行一次,并返回 ClockEvent 对象。如果超时时间未指定或为 0,回调将在渲染了下一帧之后被调用。要取消该事件,请在返回的事件上调用 ClockEvent.cancel()。
-
create_trigger(callback, timeout=0) − 这个函数创建一个触发器事件。与另外两个函数不同的是,事件不会自动安排,你需要调用它。和另外两个函数一样,在事件执行前通过调用 ClockEvent.cancel() 来取消它。要再次安排它,只需调用事件 (event())。
create_trigger() 函数具有以下参数 −
-
callback − 要执行的回调。来自 kivy。它带有一个 timeout 参数,用于指定在调用回调之前需要等待多长时间。
-
interval − 一个布尔参数,表示回调应该被调用一次 (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() 方法。
Example
下面给出的代码在 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
layout 类 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
本练习的 complete code 如下所示 −
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()