You need to enable JavaScript to run this app. KivyMD开发中如何修改KV字符串定义的列表项组件属性
优惠活动
大模型
产品
解决方案
定价
更多

KivyMD开发中如何修改KV字符串定义的列表项组件属性

报错核心原因
  • 触发KeyError: 'item'的本质是Kivy的ids作用域规则限制:self.root.ids 仅存储根KV树(也就是build方法返回的ScrollView+MDList结构)中显式声明id的组件。
  • 你在独立定义的ListItemKV字符串里声明的id: item,属于动态加载的子组件独立作用域,不会被挂载到根组件的ids字典中,因此全局索引访问时找不到对应对象。
  • 原有代码的执行时序逻辑错误:你尝试在ListItem还未被加载、甚至还没被添加到界面树时,就通过全局id修改它的text属性,完全不符合组件加载的流程顺序。
修正后的实现方案

按照KivyMD的组件加载规则调整逻辑,不需要给独立动态加载的ListItem设置全局id,直接在加载环节获取实例引用修改属性即可,具体调整点:

  1. 移除ListItemKV块里冗余的id: item声明,避免无效作用域造成的干扰
  2. 调整on_start方法中的循环执行顺序:先加载ListItem组件拿到实例对象,再给实例的text属性赋值,最后将赋值完成的组件添加到MDList中

完整可运行的修正代码:

from kivymd.app import MDApp
from kivy.lang.builder import Builder

example_list = ['a', 'b', 'c']

KV = """
ScrollView:
    MDList:
        id: List
"""

ListItem = """
OneLineAvatarListItem:
    text: ""
    ImageLeftWidget:
        source: "icon.png"
"""

class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        for letter in example_list:
            # 先加载组件获取当前实例
            current_list_item = Builder.load_string(ListItem)
            # 直接给当前实例的文本属性赋值
            current_list_item.text = letter
            # 将赋值完成的组件添加到MDList中
            self.root.ids.List.add_widget(current_list_item)

MainApp().run()
实现效果

调整后的代码会按照给定的列表数据,逐一生成带固定左侧图标的单行列表项,完全匹配预期的带左侧图标的列表展示效果,不会再触发ids相关的KeyError报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 10:45:04