Kivy中AttributeError: 'NoneType'无get_screen属性问题求助
问题分析与解决方案
错误根源
你遇到的AttributeError是因为**Customer_page继承了MDApp,但你直接实例化该类后就调用next()/next1()方法,此时self.root并未初始化**。MDApp的root属性只有在调用run()方法或者执行完build()逻辑后才会被赋值,而你只是创建了Customer_page实例,没有启动它,所以self.root是None,自然无法调用get_screen()。
另外,Kivy/MD应用中应该只有一个MDApp实例作为入口,你在LoginPage(主App)里实例化另一个MDApp子类Customer_page,这种设计本身就不符合框架规范。
修复方案
步骤1:重构customer.py,将Customer_page改为普通工具类
把Customer_page从MDApp子类改成普通类,通过传入ScreenManager实例来访问屏幕元素:
from kivymd.app import MDApp class Customer_page: def __init__(self, screen_manager): self.screen_manager = screen_manager # 获取当前运行App的主题配置 self.theme_cls = MDApp.get_running_app().theme_cls def next(self): customer_screen = self.screen_manager.get_screen('customer') customer_screen.ids.slide.load_next(mode="next") customer_screen.ids.info.text_color = self.theme_cls.primary_color customer_screen.ids.progress.value = 100 customer_screen.ids.icon.text_color = self.theme_cls.primary_color customer_screen.ids.icon.icon = "check-decagram" def next1(self): customer_screen = self.screen_manager.get_screen('customer') customer_screen.ids.slide.load_next(mode="next") customer_screen.ids.address.text_color = self.theme_cls.primary_color customer_screen.ids.progress1.value = 100 customer_screen.ids.icon1.text_color = self.theme_cls.primary_color customer_screen.ids.icon1.icon = "check-decagram"
步骤2:修改登录文件,传入ScreenManager实例
在LoginPage的build()方法中,创建Customer_page实例时传入已初始化的screen_manager,同时优化全局变量的使用:
from kivy.clock import Clock from kivy.uix.screenmanager import ScreenManager from kivymd.app import MDApp from kivy.lang import Builder from kivy.core.window import Window import customer Window.size = (350, 580) class LoginPage(MDApp): def build(self): screen_manager = ScreenManager() screen_manager.add_widget(Builder.load_file("home_page.kv")) screen_manager.add_widget(Builder.load_file("reg_customer.kv")) # 传入screen_manager给Customer_page cus = customer.Customer_page(screen_manager) cus.next() cus.next1() return screen_manager def on_start(self): Clock.schedule_once(self.login, 3) def login(self, *args): self.root.current = "main" # 用self.root替代全局变量,符合Kivy规范 if __name__ == "__main__": LoginPage().run()
额外注意事项
- 确保你的
reg_customer.kv文件中,目标屏幕的name属性确实是customer,否则get_screen('customer')会抛出找不到屏幕的错误。 - 尽量避免使用全局变量,改用
self.root访问ScreenManager是Kivy框架的标准用法。
内容的提问来源于stack exchange,提问作者shourya chourasia
相关产品推荐
相关产品推荐

