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

获取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()

错误原因

  1. ID大小写不匹配:kv文件里Label的id是name_label(小写l),但Python代码里调用的是name_Label(大写L)。Kivy的控件ID是大小写敏感的,找不到对应ID的控件时就会抛出该错误。
  2. ScreenManager未初始化:MyApp的build方法中,sm变量未创建实例就直接使用,会触发NameError。
  3. 无触发逻辑: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:37:38