获取Kivy Label ID遇AttributeError:super对象无__getattr__属性的解决咨询
Kivy控件ID错误修复:AttributeError: 'super' object has no attribute 'getattr'
问题场景
执行以下Kivy代码时,在标注的错误行触发错误:AttributeError: 'super' object has no attribute '__getattr__'. Did you mean: '__setattr__'?,疑问是否是控件ID处理方式有误,该如何修复?
原代码:
from kivy.app import App from kivy.uix.widget import Widget from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen class MyApp(App): def build(self): sm.add_widget(InputScreen(name="Input")) return sm Builder.load_string(''' <InputScreen>: BoxLayout: Label: id: name_label text: "x" ''') class InputScreen(Screen): def press(self): name = "Trevor" self.ids.name_Label.text = "Is your name"+name+" ?" #Error line if __name__ == '__main__': MyApp().run()
错误原因
- ID大小写不匹配:kv文件里Label的id是
name_label(小写l),但Python代码里调用的是name_Label(大写L)。Kivy的控件ID是大小写敏感的,找不到对应ID的控件时就会抛出该错误。 - ScreenManager未初始化:
MyApp的build方法中,sm变量未创建实例就直接使用,会触发NameError。 - 无触发逻辑:
press方法没有绑定任何交互事件,代码不会执行到错误行。
修复方案
修复后的完整代码
from kivy.app import App from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.button import Button Builder.load_string(''' <InputScreen>: BoxLayout: orientation: 'vertical' Label: id: name_label text: "x" Button: text: "点击测试" on_press: root.press() ''') class InputScreen(Screen): def press(self): name = "Trevor" # 修正ID大小写,与kv文件定义一致 self.ids.name_label.text = f"Is your name {name} ?" class MyApp(App): def build(self): sm = ScreenManager() # 初始化ScreenManager实例 sm.add_widget(InputScreen(name="Input")) return sm if __name__ == '__main__': MyApp().run()
关键修复点
- 统一ID大小写:将
self.ids.name_Label改为self.ids.name_label,与kv文件中的ID完全匹配。 - 初始化ScreenManager:在
build方法中添加sm = ScreenManager(),避免变量未定义错误。 - 添加交互触发:在kv文件中添加Button控件,绑定
on_press事件到root.press(),确保方法能被执行。 - 优化字符串拼接:使用f-string替代传统拼接,提升代码可读性。
内容的提问来源于stack exchange,提问作者Faruk Nergiz
相关产品推荐
相关产品推荐

