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

如何在Kivy的Python代码文件中为组件设置id并解决相关报错

Kivy动态创建组件id设置报错解决方案

报错根因

  • ids是Kivy为KV语言中声明id的组件所属的父/根组件生成的属性,App类本身不自带ids属性,直接调用self.ids(self是App实例)必然会触发属性不存在错误。
  • 仅在KV代码中声明了id的组件会被自动注册到所属父组件的ids字典中,Python代码动态创建的组件不会自动注册,需要手动维护引用。

解决方案

场景1:无需为动态组件绑定id,仅需正常渲染组件

你当前贴出的代码中未包含报错行self.ids[element] = weakref.ref(external_el),直接删除该行即可正常运行,你原有代码中self.root.ids.container的写法是正确的,只要你的KV代码中根组件下确实定义了id为container的容器组件即可。

场景2:需要绑定动态组件id,后续通过id调用组件

推荐在App类中自定义字典存储动态组件的引用,避免和KV自动生成的ids产生命名冲突,完整修改示例如下:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.card import MDCard
from kivy.uix.boxlayout import BoxLayout
from kivymd.uix.button import MDRectangleFlatButton

# 替换为你自己的KV代码,确保根组件下有id为container的容器
KV = '''
Screen:
    BoxLayout:
        id: container
        orientation: 'vertical'
'''

class NavigationDrawer(MDApp):
    # 自定义字典存储动态组件引用
    dynamic_ids = {}
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        files=[{"price":"890" , "meter" : "36" , "elevator" : "True"}]
        for file in files:
            first_base_el = MDCard(size_hint=(1, None), size=(self.root.width, self.root.height / 4))
            second_base_el =BoxLayout(orientation='vertical')
            for element in file.keys() :
                external_el = MDRectangleFlatButton(
                        text=f'{element} : {file[element]}',
                        size_hint=(1, .2)
                )
                # 将动态组件存入自定义字典,后续通过self.dynamic_ids[element]即可调用对应组件
                self.dynamic_ids[element] = external_el
                second_base_el.add_widget(external_el)
            first_base_el.add_widget(second_base_el)
            self.root.ids.container.add_widget(first_base_el)

if __name__ == "__main__":
    NavigationDrawer().run()

注意事项

  • 不要尝试给App实例手动添加ids属性,不符合Kivy的架构设计,所有界面组件的引用建议统一存到根组件self.root的属性中,或者单独维护自定义字典。
  • 若动态组件存在重名可能,可以给字典key加自定义前缀(比如btn_price、card_0)避免覆盖已有引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:45:02