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

Kivy调用FireBase类报错'FireBase' object has no attribute 'root'如何解决

Kivy自定义类访问root属性报错解决方案

错误原因

你自行定义的FireBase类是独立普通类,没有继承MDApp,只有MDApp实例才自带root属性指向build方法返回的根控件,因此在FireBase类中直接调用self.root会触发属性不存在的错误。

解决方法

方案1:初始化FireBase时传入App实例

修改FireBase类新增构造方法,接收并保存App实例,后续通过保存的实例访问root:

class FireBase:
    def __init__(self, app):
        self.app = app

    def sign_up(self, username, email, password):
        ...

    def poggers(self):
        self.app.root.ids.login_pass.text = ""

修改MainApp中FireBase初始化逻辑,传入当前App实例:

class MainApp(MDApp):
    def build(self):
        self.firebase = FireBase(self)
        screen_manager = ScreenManager()
        screen_manager.add_widget(Builder.load_file("kv-files/main.kv"))
        screen_manager.add_widget(Builder.load_file("kv-files/login.kv"))
        screen_manager.add_widget(Builder.load_file("kv-files/signup.kv"))
        return screen_manager

方案2:poggers方法直接接收输入框实例

修改FireBase类的poggers方法,接收外部传入的输入框实例直接操作:

class FireBase:
    def sign_up(self, username, email, password):
        ...

    def poggers(self, pass_input):
        pass_input.text = ""

修改kv文件中按钮的绑定逻辑,将login_pass输入框作为参数传入:

Button:
    ...
    on_press:
        app.firebase.poggers(login_pass)

方案3:清空逻辑放到App类中实现

如果不想改动FireBase类结构,可以把清空输入框的逻辑放在MainApp中,按钮直接绑定App的方法:

class MainApp(MDApp):
    def build(self):
        self.firebase = FireBase()
        screen_manager = ScreenManager()
        screen_manager.add_widget(Builder.load_file("kv-files/main.kv"))
        screen_manager.add_widget(Builder.load_file("kv-files/login.kv"))
        screen_manager.add_widget(Builder.load_file("kv-files/signup.kv"))
        return screen_manager
    
    def clear_login_pass(self):
        self.root.ids.login_pass.text = ""

kv文件绑定修改为:

Button:
    ...
    on_press:
        app.clear_login_pass()

注意:如果login_pass是定义在Login页面对应的Screen内部,没有注册到ScreenManager的ids中,需要先通过ScreenManager获取对应Screen再访问ids,示例:self.root.get_screen("login_screen").ids.login_pass.text = "",需要提前给Login页面的Screen设置name: "login_screen"属性。

内容的提问来源于stack exchange,提问作者olicodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:15:02