Kivy开发报错:'super' object has no attribute '__getattr__'求助
Kivy动态更新Label遇AttributeError/KeyError的解决办法
问题核心
你碰到的KeyError: 'text_label'是根源——当前代码试图访问的text_label这个控件ID不存在于当前类的ids字典中;而'super' object has no attribute '__getattr__'是Kivy找不到ID时抛出的连锁错误,本质还是ID匹配或控件访问逻辑的问题。
常见排查与解决步骤
1. 核对KV文件中的ID拼写
先确认KV文件里Label的ID完全是text_label,大小写、拼写不能有任何偏差,比如别写成TextLabel或textlabel。示例正确写法:
<MainWidget>: Label: id: text_label text: "初始文本"
2. 理清控件所属类与访问类的关系
如果text_label在ClassA里,你却在ClassB的correct/incorrect方法里直接用self.ids.text_label访问,肯定找不到——因为ClassB的ids里没有这个控件。正确的做法是关联两个类的实例:
- 给ClassB添加主类引用参数:
class AnswerButton(Button): def __init__(self, main_widget, **kwargs): super().__init__(**kwargs) self.main_widget = main_widget def on_press(self): # 点击后调用主类的correct方法 self.main_widget.correct()
- 创建按钮时传入主类实例:
class MainWidget(BoxLayout): def __init__(self, **kwargs): super().__init__(**kwargs) # 传入自身作为引用 self.add_widget(AnswerButton(main_widget=self)) def correct(self): # 主类里直接访问自己的ids self.ids.text_label.text = "回答正确!"
3. 确保KV文件正确加载
如果用Builder.load_file()或Builder.load_string()加载KV,要保证加载操作在实例化对应控件类之前执行;如果用Kivy的自动匹配规则(比如主类是MyApp,KV文件名为myapp.kv),要确保文件名是类名小写且去掉App后缀。
4. 避免在__init__中直接访问ids
Kivy的ids字典是在控件树构建完成后才生成的,__init__方法执行时控件还没创建,直接访问会报错。可以用Clock.schedule_once延迟执行初始化逻辑:
from kivy.clock import Clock class MainWidget(BoxLayout): def __init__(self, **kwargs): super().__init__(**kwargs) Clock.schedule_once(self.post_init) def post_init(self, dt): self.ids.text_label.text = "初始化完成"
内容的提问来源于stack exchange,提问作者Samk
相关产品推荐
相关产品推荐

