在Kivy的kv文件中如何引用其他类的方法,报AttributeError怎么解决
报错核心原因
你遇到的问题有两个根本逻辑错误:
Restore是独立定义的类,你没有在Test3App中实例化它,也没有绑定为App的属性,kv文件里app.Restore是访问App实例下的同名属性,自然不存在。- 就算你能访问到
Restore类,它本身没有root属性,调用font_size_reset方法时也会因为找不到界面控件触发新报错。
解决方法
方案1:直接合并方法到App类(最简单,适合当前简单场景)
这个场景逻辑复杂度很低,没必要单独拆分Restore类,直接把重置方法放到Test3App里即可:
# 修改后的test3.py from kivy.app import App class Test3App(App): def enlarge_text(self): if self.root.ids.label.font_size <90: self.root.ids.label.font_size += 16 else: self.root.ids.but1.text = ' font_size at\n[b][size=20]Maximum' self.root.ids.but1.color = 'yellow' # 直接把重置方法写在App类内 def font_size_reset(self): self.root.ids.label.font_size = 16 self.root.ids.but1.text = 'font_size\nEnlarge' self.root.ids.but1.color = 'white' if __name__ == '__main__': Test3App().run()
对应修改test3.kv的恢复按钮触发逻辑:
Button: text: 'font_size\nRestore' on_press: app.font_size_reset()
方案2:保留独立Restore类(适合复杂场景需要拆分逻辑的情况)
如果确实需要把重置逻辑拆分到独立类,需要给Restore传入App实例来获取界面控件,同时在App初始化时实例化Restore绑定为属性:
# 修改后的test3.py from kivy.app import App class Restore(): # 初始化时传入App实例 def __init__(self, app): self.app = app def font_size_reset(self): # 通过传入的app实例访问界面控件 self.app.root.ids.label.font_size = 16 self.app.root.ids.but1.text = 'font_size\nEnlarge' self.app.root.ids.but1.color = 'white' class Test3App(App): # 初始化时实例化Restore,绑定为自身属性 def build(self): self.restore = Restore(self) return super().build() def enlarge_text(self): if self.root.ids.label.font_size <90: self.root.ids.label.font_size += 16 else: self.root.ids.but1.text = ' font_size at\n[b][size=20]Maximum' self.root.ids.but1.color = 'yellow' if __name__ == '__main__': Test3App().run()
对应修改test3.kv的恢复按钮触发逻辑,注意访问的是实例化的对象名(小写restore)不是类名:
Button: text: 'font_size\nRestore' on_press: app.restore.font_size_reset()
内容的提问来源于stack exchange,提问作者DaiBach
相关产品推荐
相关产品推荐

