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

Kivy跨文件屏幕切换故障求助:点击按钮程序崩溃

Kivy跨文件屏幕切换问题解决方案

错误原因分析

  1. 多App实例冲突:每个屏幕文件(screen_1.py、screen_3.py)里都定义了独立的App类并执行App().run(),导入时会直接启动各自的应用,覆盖main.py的主应用流程。
  2. 屏幕名称不统一:main.py中屏幕名称为大写开头(Screen1、Screen3),但screen_1.py里用的是小写开头(screen1、screen2),切换时因名称不匹配找不到目标屏幕。
  3. 未加载全部屏幕:main.py的WindowManager只添加了Screen1和Screen3,缺少Screen2,导致切换到Screen2时也会出错。

修复步骤及代码示例

1. 修改 screen_1.py

删除独立的App、ScreenManagement定义及启动语句,只保留屏幕类和KV字符串,统一屏幕名称:

from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

screen = '''
<Screen1>
    BoxLayout:
        orientation: 'vertical'
        MDLabel:
            text: 'Screen 1'
            text_color: 'black'            
        Button:
            text: 'Screen_2'
            pos_hint: {'center_x': .5, 'center_y': .3}
            on_press:
                root.change_screen()

<Screen2>
    BoxLayout:
        orientation: 'vertical'
        MDLabel:
            text: 'Screen 2'
            text_color: 'black'
            pos_hint: {'center_x': .5, 'center_y': .5}
        Button:
            text: 'Screen_3'            
            on_press:
                root.change_screen_3()
        Button:            
            text: 'BackToScreen_1'                
            on_press:
                root.change_screen_1()
'''

Builder.load_string(screen)

class Screen1(Screen):
    def change_screen(self):
        self.manager.current = 'Screen2'
        self.manager.transition.direction = 'left'

class Screen2(Screen):
    def change_screen_1(self):
        self.manager.current = 'Screen1'
        self.manager.transition.direction = 'right'

    def change_screen_3(self):
        self.manager.current = 'Screen3'
        self.manager.transition.direction = 'left'

2. 修改 screen_3.py

同样删除独立应用相关代码,统一屏幕名称:

from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

screen3 = '''
<Screen3>
    BoxLayout:
        orientation: 'vertical'
        MDLabel:
            text: 'Screen 3'
            text_color: 'black'            
        Button:
            text: 'ToScreen_2'
            pos_hint: {'center_x': .5, 'center_y': .3}
            on_press:
                root.change_screen()
'''

Builder.load_string(screen3)

class Screen3(Screen):
    def change_screen(self):
        self.manager.current = 'Screen2'
        self.manager.transition.direction = 'right'

3. 修改 main.py

导入所有屏幕类,添加到WindowManager统一管理:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager
from screen_1 import Screen1, Screen2
from screen_3 import Screen3

class WindowManager(ScreenManager):
    pass

sm = WindowManager()

# 添加所有需要的屏幕
screens = [Screen1(name="Screen1"), Screen2(name="Screen2"), Screen3(name="Screen3")]
for screen in screens:
    sm.add_widget(screen)

sm.current = "Screen1"

class TestApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()

验证方法

直接运行main.py,即可实现:

  • Screen1 → Screen2 → Screen3 的正向切换
  • Screen3 → Screen2 → Screen1 的反向切换

内容的提问来源于stack exchange,提问作者Максим Игрок

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:35:05