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"
   
# 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。因此,要儘快呼叫回撥函式,請將 schedule 事件的第二個引數設定為 0,或者透過不使用引數來使用預設值。

Clock.schedule_once(my_callback)

使用“-1”的超時會導致事件在下一幀之前發生,將其設定為 0 會導致事件在下一幀之後發生。

觸發事件

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() 方法。

示例

下面給出的程式碼在 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()

輸出

執行此程式時,它將顯示以下應用程式視窗。輸入倒計時器的值,然後單擊“開始”按鈕。

Kivy Clock

標籤開始更新,遞減倒計時值。

Kivy Clock Start

當它達到“0”時,按鈕將再次啟用。

Kivy Clock Stop
廣告