Kivy中ScreenManager调用random_screen报AttributeError的解决求助
解决Kivy中点击按钮随机跳转屏幕的AttributeError问题
错误原因
- 你定义的
MyScreens类从未被使用,Q1/Q2/Q3直接继承自Screen而非MyScreens - KV代码中调用
app.root.random_screen(),但app.root是原生ScreenManager实例,该类没有random_screen方法 - 原
random_screen方法逻辑错误:self.source是Image控件的属性,而非ScreenManager切换屏幕的正确属性
修改后的Python代码
from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen from random import choice # 自定义ScreenManager子类,集成随机切换屏幕的方法 class MyScreenManager(ScreenManager): screens = ["Q1", "Q2", "Q3"] def random_screen(self, *_): # 可选:排除当前屏幕,确保跳转到其他不同屏幕 current_screen = self.current available_screens = [s for s in self.screens if s != current_screen] # 切换到随机目标屏幕 self.current = choice(available_screens) if available_screens else current_screen class Q1(Screen): pass class Q2(Screen): pass class Q3(Screen): pass class TestApp(App): def build(self): sm = MyScreenManager() sm.add_widget(Q1(name='Q1')) sm.add_widget(Q2(name='Q2')) sm.add_widget(Q3(name='Q3')) # 修复原代码错误:原添加了重复的Q2实例 return sm if __name__ == '__main__': TestApp().run()
修改后的KV代码
<Q1>: Image: source: 'Q1.png' FloatLayout: size: root.width, root.height/2 Button: size_hint: 0.3, 0.25 pos_hint: {"x":0.09, "top":1.16} background_color: 1, 1, 1, 0.2 on_release: app.root.random_screen() <Q2>: Image: source: 'Q2.png' FloatLayout: size: root.width, root.height/2 Button: size_hint: 0.3, 0.25 pos_hint: {"x":0.09, "top":1.16} background_color: 1, 1, 1, 0.2 on_press: app.root.random_screen() <Q3>: Image: source: 'Q3.png' FloatLayout: size: root.width, root.height/2 Button: size_hint: 0.3, 0.25 pos_hint: {"x":0.09, "top":1.16} background_color: 1, 1, 1, 0.2 on_press: app.root.random_screen()
关键修改点
- 将
random_screen方法移到自定义的MyScreenManager类中,确保app.root(即ScreenManager实例)能调用该方法 - 用
self.current控制屏幕切换,这是ScreenManager的标准属性 - 修复了原代码中重复添加Q2屏幕的错误
- 可选添加了排除当前屏幕的逻辑,避免重复停留在同一屏幕
内容的提问来源于stack exchange,提问作者Florin Iftim
相关产品推荐
相关产品推荐

