Kivy的ButtonBehavior學習
- ButtonBehavior 簡介
- 1、主要特點
- 2、基本用法
- 3、主要事件
- 4、常用屬性
- 5、方法
- 代碼示例
文檔:https://kivy.org/doc/stable/api-kivy.uix.behaviors.button.html#kivy.uix.behaviors.button.ButtonBehavior
ButtonBehavior 簡介
ButtonBehavior 是 Kivy 框架中的一個行為類,用于為其他小部件添加按鈕式的交互功能。
1、主要特點
- 非可視化組件:ButtonBehavior 本身不提供任何視覺元素,它只是添加按鈕交互邏輯
- 混合使用:可以與其他小部件類一起多重繼承,使任何小部件具有按鈕行為
- 事件處理:自動處理常見的觸摸/點擊事件
2、基本用法
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Imageclass ImageButton(ButtonBehavior, Image):def on_press(self):print("圖片按鈕被按下")def on_release(self):print("圖片按鈕被釋放")
3、主要事件
on_press()
: 當按鈕被按下時觸發on_release()
: 當按鈕被釋放時觸發on_state()
: 當按鈕狀態改變時觸發(正常/按下)
4、常用屬性
state
: 按鈕的當前狀態(‘normal’ 或 ‘down’)always_release
: 布爾值,決定是否總是觸發釋放事件,默認是false
,也就是按鈕按鈕后移動到按鈕外面釋放,不會調用on_release
,但是state
還是會改變last_touch
:最后一次觸碰按鈕的事件min_state_time
:The minimum period of time which the widget must remain in the ‘down’ state.但是我沒有驗證成功。
5、方法
trigger_action(duration=0.1)
代碼調用按下按鈕,duration是按下的時間
ButtonBehavior 使得開發者可以輕松地為任何小部件添加按鈕交互功能,而不必從頭開始實現所有觸摸事件處理邏輯。
代碼示例
from kivy.app import App
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.properties import StringProperty
# 修改全局默認值示例
from kivy.config import Config
Config.set('graphics', 'min_state_time', '50')
# 在創建窗口前設置
Config.set('graphics', 'width', '600')
Config.set('graphics', 'height', '300')
from kivy.clock import Clock
# 創建自定義圖像按鈕類
class ImageButton(ButtonBehavior, Image):# 定義兩個圖像路徑屬性,用于按鈕的不同狀態normal_image = StringProperty('1.png')pressed_image = StringProperty('2.png')def __init__(self, **kwargs):super(ImageButton, self).__init__(**kwargs)self.source = self.normal_imagedef on_press(self):# 按鈕按下時切換圖像self.source = self.pressed_imageprint(f"on_press 按鈕 {self.state}!")print(f"on_press 按鈕 {self.last_touch}!")print(f"on_press 按鈕 {self.min_state_time}!")def on_release(self):# 按鈕釋放時恢復原圖像self.source = self.normal_imageprint(f"on_release 按鈕 {self.state}!")print(f"on_release 按鈕 {self.last_touch}!")print(f"on_release 按鈕 {self.min_state_time}!")print(f"按鈕 {self} 被點擊!")def on_state(self, instance, value):# always_release默認是false,在按鈕上按下,在按鈕的外面松開,# 不會調用on_release,但是on_state還是會改變print(f"on_state 按鈕 {self.state}!")# 主應用類
class ButtonBehaviorDemo(App):def build(self):# 加載KV語言self.nn= ImageButton() Clock.schedule_once(ss.tr, 3) # 延時3秒后調用btn2 = Button(text='World',background_normal='2.png',background_down='1.png')box = BoxLayout()box.add_widget(self.nn)box.add_widget(btn2)return boxdef tr(self, dt):print(dt)self.nn.trigger_action(3) # 代碼觸動按下,按下時間為3s# 運行應用
if __name__ == '__main__':ss = ButtonBehaviorDemo()ss.run()