Kivy - 事件



Kivy 是一個 Python 庫,可以幫助您構建跨平臺的 GUI 應用程式。任何 GUI 應用程式都是事件驅動的,其中程式的流程不是順序的(從上到下),而是由使用者與介面上的控制元件互動來決定的。使用者操作,例如單擊按鈕、“從列表中選擇一個專案”或“從可用的單選按鈕中選擇一個選項”等,稱為事件

基於 GUI 的程式會預料到其環境中可能發生的所有事件,並在某個事件發生時(以及如果發生)將其分派給相應的處理程式函式。

Kivy Events

當呼叫 Kivy 的 App 物件的 run() 方法時,應用程式會啟動一個“事件監聽”迴圈,併為每種型別的事件觸發相應的回撥函式。

全域性事件排程器

Kivy 框架包含 EventDispatcher 類。它將事件物件分派到控制元件樹,並且事件會透過控制元件層次結構傳播。當處於可以處理事件位置的控制元件時,其關聯的回撥處理程式會被觸發。控制元件、動畫時鐘類是事件排程器的示例。

Clock 是一個全域性事件排程器,允許您在特定間隔安排和觸發事件。它定義了諸如 'schedule_once()' 和 'schedule_interval()' 之類的方法來註冊要在一定延遲後或定期呼叫的函式或方法。此機制對於處理定時事件、動畫更新和應用程式中的其他重複任務很有用。

示例

在以下示例中,我們在控制元件樹中放置了一個標籤和兩個按鈕。標題為“開始”的按鈕安排一個事件每秒定期發生一次。schedule_interval() 函式使用以下語法編寫:

Clock.schedule_interval(callback, timeout)

另一方面,標題為“停止”的第二個按鈕呼叫 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()

輸出

執行上述程式。標籤最初顯示“0”。單擊“開始”按鈕。標籤開始每秒在其上遞增數字。按“停止”按鈕取消安排事件。

Kivy Events

控制元件事件

大多數 Kivy 控制元件都具有內建的事件處理功能。事實上,每個控制元件都設計為處理特定型別的事件。例如,Button 控制元件處理單擊它引起的事件。您可以為控制元件上發生的特定事件(例如按鈕單擊、觸控事件或鍵盤事件)註冊事件處理程式。

通常,事件處理程式在控制元件的類或 App 類中定義為方法。它們通常以“on_”為字首,後跟事件的名稱。例如,按鈕按下事件的“on_press”。

當事件發生時,Kivy 會自動呼叫相應的事件處理程式方法,並將有關事件的相關資訊作為引數傳遞。在事件處理程式內部,您可以定義要執行的所需行為或操作。

與控制元件關聯的事件

下面列出了與一些最常用控制元件關聯的事件:

按鈕

  • on_press - 按下按鈕時觸發。

  • on_release - 釋放按鈕時觸發。

  • on_touch_down - 按鈕上開始觸控事件時觸發。

  • on_touch_up - 按鈕上結束觸控事件時觸發。

TextInput

  • on_text_validate - 使用者完成文字輸入編輯(按 Enter 或 Return)時觸發。

  • on_focus - 文字輸入獲得或失去焦點時觸發。

  • on_text - 輸入欄位中的文字發生更改時觸發。

複選框

  • on_active - 複選框選中或取消選中時觸發。

滑塊

  • on_value - 滑塊的值發生更改時觸發。

  • on_touch_down - 滑塊上開始觸控事件時觸發。

  • on_touch_up - 滑塊上結束觸控事件時觸發。

切換按鈕

  • on_state - 切換按鈕的狀態發生更改(開啟或關閉)時觸發。

  • on_press - 按下切換按鈕時觸發。

ListView

  • on_select - 列表檢視中選擇一個專案時觸發。

FileChooser

  • on_selection - 在檔案選擇器中選擇檔案或目錄時觸發。

開關

  • on_active - 開關開啟或關閉時觸發。

影片

  • on_load - 影片載入完成時觸發。

  • on_play - 影片開始播放時觸發。

  • on_pause - 影片暫停時觸發。

  • on_stop - 影片停止播放時觸發。

微調器

  • on_text - 從微調器中選擇一個專案時觸發。

ActionButton

  • on_press - 按下操作按鈕時觸發。

示例 - Kivy 中的事件處理

在解釋 Kivy 框架中的每個控制元件時,將討論這些事件。但是,在本節中,這裡提供了兩個事件處理示例。

示例 1

第一個示例顯示 Button 控制元件的“on_press”事件。在下面的程式碼中,我們有一個 Label 和一個 Button 控制元件,排列在 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()

輸出

將上述程式碼另存為“demo.py”,然後從命令列或 Python IDE 執行它。程式以標籤顯示 0 作為其標題開始。每次單擊按鈕時,標題都會加 1。

Kivy Events Start

示例 2

在此示例中,我們有一個 TextInput 控制元件和一個 Label。TextInput 繫結到 onkey() 方法。使用者輸入的每個按鍵都反映在 Label 上。

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

輸出

執行程式並在文字框中輸入一些文字。當您鍵入時,Label 標題會更新。

Kivy Events Msg

還可以定義自定義事件和事件處理程式來處理特定於應用程式的事件。為此,您需要對 'EventDispatcher' 類進行子類化並定義所需的屬性和方法。

可以使用與控制元件事件類似的 'trigger()' 和 'on_event_name' 模式來分派和處理自定義事件。

廣告