Kivy ScreenManager切换屏幕报错:找不到名为home的Screen
问题修复方案
问题根源
你代码里存在两个完全独立的ScreenManager实例:
.py文件末尾手动创建的sm实例.kv文件根节点定义的ScreenManager实例
MainApp实际运行的是kv加载的ScreenManager,但EntryWindow的切换逻辑却在操作手动创建的sm实例,两者毫无关联,自然找不到名为"home"的屏幕。
修复步骤
1. 删除冗余的ScreenManager实例
直接删掉.py文件末尾这段重复创建的代码:
sm = ScreenManager() sm.add_widget(EntryWindow(name="starting")) sm.add_widget(Home(name="home")) sm.add_widget(Exercises(name="exercises")) sm.add_widget(Gender(name="gender"))
同时在.kv文件的ScreenManager节点下补上缺失的Gender屏幕:
ScreenManager: EntryWindow: Home: Exercises: Gender: # 新增这一行,确保所有屏幕都在同一个ScreenManager下
2. 修改EntryWindow实现1秒延迟跳转
把EntryWindow的切换逻辑改成使用屏幕自带的self.manager属性(自动指向当前所属的ScreenManager),并用Clock实现1秒延迟:
class EntryWindow(Screen): def on_enter(self): # 延迟1秒执行切换操作 Clock.schedule_once(self.switch_to_home, 1) def switch_to_home(self, dt): self.manager.current = "home"
修复逻辑说明
self.manager是Kivy Screen类的内置属性,自动关联当前屏幕所属的ScreenManager,彻底避免全局变量导致的实例混淆问题Clock.schedule_once(func, delay)是Kivy官方推荐的延迟执行方式,这里设置延迟1秒,正好满足启动页显示1秒后跳转的需求
内容的提问来源于stack exchange,提问作者staff1515
相关产品推荐
相关产品推荐

