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 对象可以通过使用以下函数触发一个时钟事件 −

  1. schedule_interval(callback, timeout) − 这个函数安排了一个事件,让它在指定的秒数之后被调用。该函数返回一个 ClockEvent 对象。要取消安排好的事件,请在返回的事件上调用 ClockEvent.cancel()。

  2. schedule_once(callback, timeout=0) − 这个函数安排了一个事件,让它在指定的秒数之后执行一次,并返回 ClockEvent 对象。如果超时时间未指定或为 0,回调将在渲染了下一帧之后被调用。要取消该事件,请在返回的事件上调用 ClockEvent.cancel()。

  3. create_trigger(callback, timeout=0) − 这个函数创建一个触发器事件。与另外两个函数不同的是,事件不会自动安排,你需要调用它。和另外两个函数一样,在事件执行前通过调用 ClockEvent.cancel() 来取消它。要再次安排它,只需调用事件 (event())。

create_trigger() 函数具有以下参数 −

  1. callback − 要执行的回调。来自 kivy。它带有一个 timeout 参数,用于指定在调用回调之前需要等待多长时间。

  2. 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()

Output

运行此程序时,它将显示以下应用程序窗口。输入倒计时器的值,然后单击“开始”按钮。

kivy clock

标签开始更新,递减倒计时值。

kivy clock start

当其达到“0”时,按钮会再次启用。

kivy clock stop