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

Python Kivy如何在Switch激活时每30秒调用一次回调函数

Kivy Switch定时打印问题修复方案

报错原因

  • 使用Clock.schedule_interval()注册的回调函数,Kivy框架会默认向其传递一个时间差参数dt,表示两次调度执行的间隔时间。你定义的switch1_callback方法只接收self一个参数,多接收了框架传入的dt参数就会触发参数数量不匹配的报错。
  • 你的现有逻辑还有冗余问题:每次开关切换状态都会新增一个定时任务,开关关闭时也不会终止打印,不符合需求。

修复步骤

  1. 给switch1_callback方法补充dt参数,不需要使用该参数可以直接用_占位。
  2. 优化开关绑定逻辑,传入开关的激活状态,开关打开时启动定时、关闭时取消定时,同时避免重复创建定时任务。

修复后的完整代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:09:02