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

Kivy使用ids调用控件失败:'super'对象无__getattr__属性错误排查

Kivy中ids为空及AttributeError问题解决方法

核心原因

你遇到的问题本质是访问self.ids的时机不对:Kivy的ids字典是在kv文件完全加载并绑定到Python类实例后才会填充的。如果在__init__方法里直接访问,此时kv还未完成加载,ids是空字典,当你尝试访问self.ids._news时,Kivy会尝试通过父类查找该属性,找不到就抛出AttributeError: 'super' object has no attribute '__getattr__'。

具体解决方案

1. 使用on_kv_post回调方法

Kivy提供了on_kv_post内置回调,当kv文件加载完成并绑定到当前类实例后,会自动触发这个方法,此时可以安全访问self.ids:

from kivy.uix.screenmanager import Screen

class HomePage(Screen):
    def on_kv_post(self, base_widget):
        # 此时kv已加载完成,ids字典已填充
        news_scroll = NewsScroll()
        self.ids._news.add_widget(news_scroll)
        # 这里可以添加从JSON加载新闻并填充NewsScroll的逻辑

2. 在App的build方法中处理

如果需要在应用启动时就加载数据,可以在App类的build方法里,确保kv加载完成后再操作HomePage的ids:

from kivy.app import App

class NewsApp(App):
    def build(self):
        # 手动加载kv文件(如果没自动加载的话)
        self.load_kv('your_kv_file.kv')
        # 获取HomePage实例(假设你的ScreenManager中该screen的name是"homepage")
        home_page = self.root.get_screen("homepage")
        # 操作ids添加控件
        home_page.ids._news.add_widget(NewsScroll())
        # 加载本地JSON数据并填充到NewsScroll
        self.load_news_from_json(home_page.ids._news)
        return self.root

    def load_news_from_json(self, container):
        # 读取本地JSON文件并生成新闻控件的逻辑
        import json
        with open('news.json', 'r', encoding='utf-8') as f:
            news_data = json.load(f)
        # 遍历数据添加到container中
        for article in news_data:
            # 假设你有NewsItem控件来展示单条新闻
            news_item = NewsItem(title=article['title'], content=article['content'])
            container.add_widget(news_item)

3. 检查kv文件的正确性

确保你的kv文件中,_news这个id确实属于HomePage的子Widget,且类名完全匹配:

<HomePage>:
    BoxLayout:
        id: _news
        orientation: "vertical"
        # 其他布局属性

注意:kv中的类名<HomePage>必须和Python中定义的类名完全一致,大小写、拼写都不能错。

额外注意事项

  • 不要在__init__方法中直接访问self.ids,除非你在__init__里手动调用了self.load_kv()并确认加载完成。
  • 如果使用ScreenManager,确保HomePage已经被正确添加到ScreenManager中,并且通过get_screen()方法获取实例,而不是直接新建实例(新建的实例不会绑定kv中的ids)。

内容的提问来源于stack exchange,提问作者Sam Mumbaikar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:27:10