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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:36:29