You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:06:09