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
相关产品推荐
相关产品推荐

