Kivy中按钮无法切换屏幕及lambda函数调用问题排查
问题排查与解决思路
1. 先修正Lambda的参数捕获问题
你碰到的AssertionError: None is not callable大概率是lambda绑定参数时的常见陷阱——如果是在循环里生成按钮,直接写lambda: show_training(plan)会导致所有按钮最终传递的都是循环最后一个plan的值,甚至因变量作用域问题导致调用时参数失效。
正确写法是把plan作为lambda的默认参数固定下来,同时要注意on_press回调会自动把按钮实例作为第一个参数传给回调函数,所以lambda需要接收这个参数:
Button( text="Show", on_press=lambda btn, current_plan=plan: show_training(current_plan) )
2. Clock.schedule的正确用法
如果用Clock.schedule_once,你可能犯了直接执行函数的错误:比如写Clock.schedule_once(show_training(plan)),这会立刻执行show_training(plan),并把它的返回值(如果是None)传给schedule,自然会触发None is not callable错误。
正确的做法是把带参数的逻辑包在lambda里,同时同样注意参数捕获:
Button( text="Show", on_press=lambda btn, current_plan=plan: Clock.schedule_once(lambda dt: show_training(current_plan)) )
3. 结合show_training的验证
既然已知show_training函数本身正常,重点就放在按钮触发时是否正确传递了对应训练计划的实例:
- 可以在lambda里加个打印,确认传递的
current_plan是不是你预期的对象:lambda btn, current_plan=plan: (print(current_plan), show_training(current_plan)) - 如果打印内容正确,再检查
SingleTrainingPlan界面的切换逻辑,比如是否正确更新了ScreenManager的current属性,或者是否正确添加/移除了界面组件。
内容的提问来源于stack exchange,提问作者user18315433
相关产品推荐
相关产品推荐

