Python Kivy中bind方法失效:on_packet为何未被调用?
问题原因与解决方法
你的自定义类中重写了on_active(FXSwitch类)和on_state(FXCheckBox类)方法,但未调用父类的对应实现,导致Kivy的属性事件分发机制被中断,通过bind()绑定的on_packet方法因此无法被触发。
Kivy的属性系统中,当控件属性(如Switch的active、CheckBox的state)变化时,父类的on_<property>方法负责触发对应的事件(如on_active事件),你绑定的on_packet正是监听这个事件。如果重写on_<property>却不调用父类方法,事件就不会被正常分发,绑定的回调自然失效。
修改后的代码
from kivy.uix.checkbox import CheckBox from kivy.uix.switch import Switch from kivy.app import runTouchApp from kivy.uix.gridlayout import GridLayout class FXSwitch(Switch): def __init__(self, **kwargs): super().__init__(**kwargs) self.bind(on_active=self.on_packet) def on_active(self, *args): print('on_active') # 调用父类的on_active方法,保证事件正常触发 super().on_active(*args) def on_packet(self, *args): print('on_packet') print(args) class FXCheckBox(CheckBox): def __init__(self, **kwargs): super().__init__(**kwargs) self.bind(on_state=self.on_packet) def on_state(self, *args): print('on_state') # 调用父类的on_state方法,保证事件正常触发 super().on_state(*args) def on_packet(self, *args): print('on_packet') print(args) grid = GridLayout(cols=1) sw = FXSwitch() # 类内部已完成绑定,无需重复绑定 # sw.bind(on_active=sw.on_packet) grid.add_widget(sw) grid.add_widget(FXSwitch()) grid.add_widget(FXCheckBox()) runTouchApp(grid)
额外说明:你代码中给第一个sw重复绑定了on_packet,这会导致属性变化时回调被触发两次,建议删除该重复绑定。
内容的提问来源于stack exchange,提问作者Infinity Cliff
相关产品推荐
相关产品推荐

