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

Kivy Screen仅首次加载,调用sm.switch_to()切换屏幕时报错

解决Kivy屏幕切换时"屏幕不存在"的问题

核心问题分析

你初始化时明明添加了四个屏幕,但切换时找不到welcome/scanner,且ResultScreen中只剩input和result屏幕,大概率是后续操作中误移除了前两个屏幕,或是切换屏幕时用了错误方式导致原有屏幕实例丢失。

具体修复方案

1. 保留屏幕实例引用,避免丢失

初始化ScreenManager时,不要仅将屏幕添加进去就结束,要把每个屏幕的实例保存为变量,防止后续找不到原有实例:

from kivy.uix.screenmanager import ScreenManager, Screen

# 定义各屏幕类
class WelcomeScreen(Screen):
    pass

class ScannerScreen(Screen):
    pass

class InputScreen(Screen):
    pass

class ResultScreen(Screen):
    def check_screens(self):
        # 打印当前管理器中的所有屏幕名称
        print([s.name for s in self.manager.screens])

# 初始化ScreenManager与所有屏幕实例
sm = ScreenManager()
# 保存每个屏幕的实例引用
welcome = WelcomeScreen(name='welcome')
scanner = ScannerScreen(name='scanner')
input_scr = InputScreen(name='input')
result = ResultScreen(name='result')

# 将所有实例添加到ScreenManager
sm.add_widget(welcome)
sm.add_widget(scanner)
sm.add_widget(input_scr)
sm.add_widget(result)

2. 使用current属性切换屏幕(更安全)

放弃使用sm.switch_to(),直接设置ScreenManager的current属性为目标屏幕的名称即可,这种方式不会移除原有屏幕:

# 切换回welcome屏幕
sm.current = 'welcome'
# 切换回scanner屏幕
sm.current = 'scanner'

如果一定要用switch_to(),必须传入之前保存的原有实例,绝对不能新建实例(新建实例会导致管理器中的旧实例被替换或丢失):

# 正确用法:使用保存的原有实例
sm.switch_to(welcome)
# 错误用法:新建实例等于创建了一个与原屏幕无关的新对象
# sm.switch_to(WelcomeScreen(name='welcome'))

3. 排查kv文件与屏幕事件代码

检查你的kv文件,以及各个屏幕的on_enter/on_leave等事件代码,确认有没有写remove_widget()之类的操作,不小心将welcome/scanner从管理器中删除。比如重点查看ResultScreen的相关代码,是否在进入该屏幕时误移除了其他屏幕。

4. 分步验证屏幕状态

在初始化完ScreenManager后立刻打印所有屏幕,确认四个屏幕都已存在:

print([s.name for s in sm.screens])
# 正常输出应为:['welcome', 'scanner', 'input', 'result']

如果此处输出正常,但ResultScreen中打印只剩两个屏幕,说明是从input切换到result的过程中,某个代码删除了前两个屏幕,顺着这个流程排查即可。

内容的提问来源于stack exchange,提问作者Samuel Lino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:47:24