为什么Kivy的回调函数中无法通过ClockEvent触发另一回调?
问题原因
你代码中Clock.create_trigger绑定的回调没有正确执行_update_something方法:
你当前编写的lambda dt: self._update_something只是将_update_something方法对象作为lambda的返回值,并没有执行该方法,因此即使ClockEvent触发,目标逻辑也不会运行。
同时原代码的组件初始化顺序不规范:Kivy自定义组件的__init__方法需要先调用父类构造函数,再初始化自定义属性,否则可能出现属性绑定异常。
修复方案
有两种可选的修改方式,推荐第一种更简洁的写法:
方式1:直接绑定目标方法(无需lambda包装)
Clock触发回调时会默认传入时间增量dt参数,即使你的方法没有用到该参数也可以直接绑定:
class MyLayout(BoxLayout): spinner1 = ObjectProperty(None) label1 = ObjectProperty(None) def __init__(self, **kwargs): # 先调用父类构造方法 super().__init__(**kwargs) # 直接传入目标方法作为回调 self._myevent = Clock.create_trigger(self._update_something) def on_spinner1_select(self, text): self._myevent() def _update_something(self): print(f"Called: {time.asctime()}") self.label1.text = f"{self.spinner1.text} called on {time.asctime()}"
方式2:保留lambda写法,补充方法调用括号
如果你需要保留lambda做额外逻辑处理,给方法调用加上括号即可:
self._myevent = Clock.create_trigger(lambda dt: self._update_something())
修改后运行代码,选择Spinner的选项即可看到控制台打印和Label内容正常更新。
内容的提问来源于stack exchange,提问作者Roman B.
相关产品推荐
相关产品推荐

