
- 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 - Garden
- Kivy - 儲存
- Kivy - 向量
- Kivy - 工具函式
- Kivy - 檢查器
- Kivy - 工具
- Kivy - 日誌記錄器
- Kivy - 幀緩衝區
- Kivy 應用和專案
- Kivy - 繪圖應用
- Kivy - 計算器應用
- Kivy - 計時器應用
- Kivy - 相機處理
- Kivy - 圖片檢視器
- Kivy - 貝塞爾曲線
- Kivy - 畫布壓力測試
- Kivy - 圓形繪製
- Kivy - 元件動畫
- Kivy - 其他
- Kivy 有用資源
- Kivy - 快速指南
- Kivy - 有用資源
- Kivy - 討論
Kivy - 按鈕事件
按鈕,就像 Kivy 中大多數 GUI 元件一樣,被程式設計為響應特定型別的事件。按鈕處理以下事件型別:
on_press - 按鈕按下時觸發。
on_release - 按鈕釋放時觸發。
on_touch_down - 觸控事件在按鈕上開始時觸發。
on_touch_up - 觸控事件在按鈕上結束時觸發。
Kivy 的 EventDispatcher 類提供了一個 bind() 方法,該方法負責將事件委託給某個回撥函式進行處理。
EventDispatcher.bind(self, **kwargs)
按鈕(以及每個 Kivy 小部件)都繼承了此方法。因此,我們可以將按鈕物件繫結到任何回撥事件處理函式。您還可以將屬性繫結到回撥。
繫結事件
下面是一種將按鈕的 on_press 事件繫結到函式的典型方法:
def callback(instance): print('The button is being pressed') btn1 = Button(text='Hello world') btn1.bind(on_press=callback)
示例
在下面的示例中,我們將兩個按鈕放在 FloatLayout 中。每個按鈕的“on_press”事件都繫結到 callback() 方法。
發生“on_press”事件的按鈕的引用被傳遞到 callback() 方法,以便我們可以識別按下的按鈕的標題。
from kivy.app import App from kivy.uix.button import Button from kivy.config import Config from kivy.uix.floatlayout import FloatLayout # Configuration Config.set('graphics', 'width', '720') Config.set('graphics', 'height', '400') Config.set('graphics', 'resizable', '1') class ButtonApp(App): def on_button_press(self, instance): print("{} Button pressed!".format(instance.text)) def build(self): flo = FloatLayout() btn1 = Button(text= 'Hello World', background_color= [1,0,0,1], font_size= 20, underline= True, size_hint= (.4, .25), pos_hint= {'center_x':.5, 'center_y':.8}) btn1.bind(on_press = self.on_button_press) btn2 = Button(text= 'Hello Python', color= [0,0,1,1], font_size= 20, size_hint= (.4, .25), pos_hint= {'center_x':.5, 'center_y':.2}) flo.add_widget(btn1) btn2.bind(on_press = self.on_button_press) flo.add_widget(btn2) return flo if __name__ == '__main__': ButtonApp().run()
輸出
執行以上程式碼並按下按鈕:

每次按下時,都會呼叫 callback() 方法:
Hello World Button pressed! Hello Python Button pressed!
繫結屬性
如前所述,我們可以將回調繫結到小部件的屬性。每次屬性值更改時,都會呼叫回撥以通知更改。
btn1.bind(property=callback)
讓我們在 App 類中定義另一個方法“on_textchanged()”,並將其與btn2的 text 屬性繫結。btn1 上的 on_press 事件更改了btn2的標題,並且更改立即呼叫 on_textchanged() 方法。
示例
將ButtonApp類的程式碼更改如下:
from kivy.app import App from kivy.uix.button import Button from kivy.config import Config from kivy.uix.floatlayout import FloatLayout # Configuration Config.set('graphics', 'width', '720') Config.set('graphics', 'height', '400') Config.set('graphics', 'resizable', '1') class ButtonApp(App): def on_button_press(self, instance): print("{} Button pressed!".format(instance.text)) self.btn2.text="Hello Tutorialspoint" def on_textchanged(self, instance, value): print ("Text property changed to", instance.text) def build(self): flo = FloatLayout() self.btn1 = Button(text= 'Hello World', background_color= [1,0,0,1], font_size= 20, underline= True, size_hint= (.4, .25), pos_hint= {'center_x':.5, 'center_y':.8}) self.btn1.bind(on_press = self.on_button_press) self.btn2 = Button(text= 'Hello Python', color= [0,0,1,1], font_size= 20, size_hint= (.4, .25), pos_hint= {'center_x':.5, 'center_y':.2}) flo.add_widget(self.btn1) self.btn2.bind(text = self.on_textchanged) flo.add_widget(self.btn2) return flo if __name__ == '__main__': ButtonApp().run()
輸出
執行程式碼,先按下btn1。它更改了btn2的標題,進而呼叫“on_textchanged()”方法。
Hello World Button pressed! Text property changed to Hello Tutorialspoint
這是輸出視窗:

通常,屬性回撥使用兩個引數(物件和屬性的新值)呼叫,而“事件回撥”使用一個引數(物件)呼叫。
使用 Lambda 函式繫結
另一種繫結方法是使用 lambda(或匿名)函式。它們的優點是可以避免宣告新函式,即它們提供了一種簡潔的“重定向”回撥的方法。
將繫結btn1的“on_press”事件的語句更改為:
self.btn1.bind(on_press = lambda btn1: self.on_button_press(btn1))
使用偏函式
在 Python 中,偏函式允許我們將具有 x 個引數的函式匯出為具有較少引數的函式,併為較有限的函式設定常量值。它使函式可重用。partial() 函式定義在 Python 標準庫的functools模組中。
示例
我們可以將事件繫結到偏方法。在下面的示例中,傳遞了 Button 物件bt1和btn2。該函式交換兩者的 text 屬性。
from kivy.app import App from kivy.uix.button import Button from kivy.config import Config from kivy.uix.floatlayout import FloatLayout from functools import partial # Configuration Config.set('graphics', 'width', '720') Config.set('graphics', 'height', '300') Config.set('graphics', 'resizable', '1') class ButtonApp(App): def on_textchanged(self, instance, value): print ("Text property changed to", instance.text) def a_function(self, *args): args[0].text, args[1].text = args[1].text, args[0].text def build(self): flo = FloatLayout() self.btn1 = Button(text= 'Hello World', background_color= [1,0,0,1], font_size= 20, underline= True, size_hint= (.4, .25), pos_hint= {'center_x':.5, 'center_y':.8}) self.btn2 = Button(text= 'Hello Python', color= [0,0,1,1], font_size= 20, size_hint= (.4, .25), pos_hint= {'center_x':.5, 'center_y':.2}) flo.add_widget(self.btn1) self.btn1.bind(on_press = partial(self.a_function, self.btn1, self.btn2)) self.btn2.bind(text = self.on_textchanged) flo.add_widget(self.btn2) return flo if __name__ == '__main__': ButtonApp().run()
輸出
檢視以下輸出視窗,並觀察按下第一個按鈕如何交換兩個按鈕的文字:
