无.kv文件实现Kivy ScreenManager页面切换报错排查
可行性说明
完全可以仅通过Python代码实现Kivy框架的ScreenManager页面切换,无需依赖.kv文件,你遇到的运行错误属于代码逻辑编写问题,和实现方案本身无关。
问题根因
你的代码一共存在3处问题,其中第一处直接触发了你看到的AttributeError:
- 事件绑定逻辑错误:
self.button1.bind(on_press=self.screenTransition())这行在绑定事件时,直接调用了screenTransition()方法,而非将方法对象传入bind参数。此时emotionRecog屏幕实例还未被添加到ScreenManager中,实例的self.manager属性值为None,方法执行时访问self.manager.current就会抛出NoneType无current属性的错误。正确绑定方式是传入方法本身,不要在方法名后加括号调用。 - 屏幕布局未正确挂载:你在
emotionRecog的__init__方法中创建BoxLayout后直接return layout,但Kivy组件的__init__方法不会接收返回值作为子控件,必须显式调用self.add_widget(layout)将布局挂载到Screen实例上,否则按钮不会在界面中显示。 - 父类初始化参数传递缺失:
testW类的super调用没有传入**kwargs,会导致name这类Screen初始化参数无法正常传递,后续切屏时会找不到对应名称的目标屏幕。
修复后完整代码
from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout class ScreenManagement(ScreenManager): def __init__(self, **kwargs): super().__init__(**kwargs) class testW(Screen): def __init__(self, **kwargs): # 补全kwargs传递,保证屏幕名称等初始化参数正常生效 super().__init__(**kwargs) class emotionRecog(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) self.button1 = Button(text="Next", size_hint=(1, .1)) # 修复事件绑定:传入方法对象,不提前调用 self.button1.bind(on_press=self.screenTransition) layout = BoxLayout(orientation="vertical") layout.add_widget(self.button1) # 显式添加布局到当前屏幕 self.add_widget(layout) def screenTransition(self, *args): self.manager.current = 'test' class CamApp(App): def build(self): sm = ScreenManagement(transition=FadeTransition()) sm.add_widget(emotionRecog(name='emotion')) sm.add_widget(testW(name='test')) return sm if __name__ == "__main__": CamApp().run()
内容的提问来源于stack exchange,提问作者Kirill Vavilov
相关产品推荐
相关产品推荐

