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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:54:02