Kivy跨文件屏幕切换故障求助:点击按钮程序崩溃
Kivy跨文件屏幕切换问题解决方案
错误原因分析
- 多App实例冲突:每个屏幕文件(
screen_1.py、screen_3.py)里都定义了独立的App类并执行App().run(),导入时会直接启动各自的应用,覆盖main.py的主应用流程。 - 屏幕名称不统一:
main.py中屏幕名称为大写开头(Screen1、Screen3),但screen_1.py里用的是小写开头(screen1、screen2),切换时因名称不匹配找不到目标屏幕。 - 未加载全部屏幕:
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,提问作者Максим Игрок
相关产品推荐
相关产品推荐

