Kivy的ButtonBehavior学习
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()