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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:05:22