Python Kivy如何在Switch激活时每30秒调用一次回调函数
Kivy Switch定时打印问题修复方案
报错原因
- 使用
Clock.schedule_interval()注册的回调函数,Kivy框架会默认向其传递一个时间差参数dt,表示两次调度执行的间隔时间。你定义的switch1_callback方法只接收self一个参数,多接收了框架传入的dt参数就会触发参数数量不匹配的报错。 - 你的现有逻辑还有冗余问题:每次开关切换状态都会新增一个定时任务,开关关闭时也不会终止打印,不符合需求。
修复步骤
- 给
switch1_callback方法补充dt参数,不需要使用该参数可以直接用_占位。 - 优化开关绑定逻辑,传入开关的激活状态,开关打开时启动定时、关闭时取消定时,同时避免重复创建定时任务。
修复后的完整代码如下:
from kivy.app import App from kivy.lang import Builder from kivy.uix.floatlayout import FloatLayout from kivy.graphics import Rectangle, Color from kivy.clock import Clock kv = ''' <PrettySwitch>: size_hint: None, None size: 300, 300 canvas: Color: rgba: 0, 0, 1, 1 Rectangle: size: self.size pos: self.pos Switch: id: switch1 pos: 150, 150 size_hint: None, None size: 100, 50 active: True on_active: root.timely_switch1_callback(self.active) ''' class PrettySwitch(FloatLayout): # 存储定时调度实例,方便后续取消 _switch_clock = None def switch1_callback(self, dt): print('Hello world') def timely_switch1_callback(self, is_active): if is_active: # 避免重复创建定时任务 if not self._switch_clock: self._switch_clock = Clock.schedule_interval(self.switch1_callback, 30) else: # 开关关闭时终止定时任务 if self._switch_clock: self._switch_clock.cancel() self._switch_clock = None class SwitchApp(App): def build(self): Builder.load_string(kv) return PrettySwitch() if __name__ == '__main__': SwitchApp().run()
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

