- Kivy 教程
- Kivy - 首頁
- Kivy 基礎
- Kivy - 入門
- Kivy - 安裝
- Kivy - 架構
- Kivy - 檔案語法
- Kivy - 應用程式
- Kivy - Hello World
- Kivy - 應用程式生命週期
- Kivy - 事件
- Kivy - 屬性
- Kivy - 輸入
- Kivy - 行為
- Kivy 按鈕
- Kivy - 按鈕
- Kivy - 按鈕事件
- Kivy - 按鈕顏色
- Kivy - 按鈕大小
- Kivy - 按鈕位置
- Kivy - 圓形按鈕
- Kivy - 停用按鈕
- Kivy - 圖片按鈕
- Kivy 控制元件
- Kivy - 控制元件
- Kivy - 標籤
- Kivy - 文字輸入
- Kivy - 畫布
- Kivy - 線條
- Kivy - 複選框
- Kivy - 下拉列表
- Kivy - 視窗
- Kivy - 滾動檢視
- Kivy - 走馬燈
- Kivy - 滑塊
- Kivy - 圖片
- Kivy - 彈出視窗
- Kivy - 開關
- Kivy - 微調器
- Kivy - 分隔器
- Kivy - 進度條
- Kivy - 氣泡
- Kivy - 標籤頁面板
- Kivy - 散點圖
- Kivy - 手風琴
- Kivy - 檔案選擇器
- Kivy - 顏色選擇器
- Kivy - 程式碼輸入
- Kivy - 模態檢視
- Kivy - 切換按鈕
- Kivy - 相機
- Kivy - 樹形檢視
- Kivy - reStructuredText
- Kivy - 操作欄
- Kivy - 媒體播放器
- Kivy - 模板檢視
- Kivy - 虛擬鍵盤
- Kivy - 觸控漣漪
- Kivy - 音訊
- Kivy - 影片
- Kivy - 拼寫檢查
- Kivy - 效果
- Kivy - 輸入記錄器
- Kivy - OpenGL
- Kivy - 文字
- Kivy - 文字標記
- Kivy - 設定
- Kivy 佈局
- Kivy - 佈局
- Kivy - 浮動佈局
- Kivy - 網格佈局
- Kivy - 盒式佈局
- Kivy - 堆疊佈局
- Kivy - 錨點佈局
- Kivy - 相對佈局
- Kivy - 頁面佈局
- Kivy - 回收佈局
- Kivy - 佈局巢狀佈局
- Kivy 高階概念
- Kivy - 配置物件
- Kivy - 圖集
- Kivy - 資料載入器
- Kivy - 快取管理器
- Kivy - 控制檯
- Kivy - 動畫
- Kivy - 多筆畫
- Kivy - 時鐘
- Kivy - SVG
- Kivy - UrlRequest
- Kivy - 剪貼簿
- Kivy - 工廠
- Kivy - 手勢
- Kivy - 語言
- Kivy - 圖形
- Kivy - 繪製
- Kivy - 打包
- Kivy - 花園
- Kivy - 儲存
- Kivy - 向量
- Kivy - 工具
- Kivy - 檢查器
- Kivy - 工具
- Kivy - 日誌記錄器
- Kivy - 幀緩衝區
- Kivy 應用程式和專案
- Kivy - 繪圖應用程式
- Kivy - 計算器應用程式
- Kivy - 計時器應用程式
- Kivy - 相機處理
- Kivy - 圖片檢視器
- Kivy - 貝塞爾曲線
- Kivy - 畫布壓力測試
- Kivy - 圓形繪製
- Kivy - 控制元件動畫
- Kivy - 雜項
- Kivy 有用資源
- Kivy - 快速指南
- Kivy - 有用資源
- Kivy - 討論
Kivy - 事件
Kivy 是一個 Python 庫,可以幫助您構建跨平臺的 GUI 應用程式。任何 GUI 應用程式都是事件驅動的,其中程式的流程不是順序的(從上到下),而是由使用者與介面上的控制元件互動來決定的。使用者操作,例如單擊按鈕、“從列表中選擇一個專案”或“從可用的單選按鈕中選擇一個選項”等,稱為事件。
基於 GUI 的程式會預料到其環境中可能發生的所有事件,並在某個事件發生時(以及如果發生)將其分派給相應的處理程式函式。
當呼叫 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 控制元件都具有內建的事件處理功能。事實上,每個控制元件都設計為處理特定型別的事件。例如,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。
示例 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 標題會更新。
還可以定義自定義事件和事件處理程式來處理特定於應用程式的事件。為此,您需要對 'EventDispatcher' 類進行子類化並定義所需的屬性和方法。
可以使用與控制元件事件類似的 'trigger()' 和 'on_event_name' 模式來分派和處理自定義事件。