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

动态添加MDDropDownItem时出现KeyError: 'label_item'问题求助

解决动态添加MDDropDownItem时的KeyError: 'label_item'问题

问题背景

需要实现以下功能:

  • 初始显示一个带关联下拉菜单的MDDropDownItem
  • 下方设置“+”按钮,点击后该按钮被替换为新的MDDropDownItem,同时“+”按钮移到新项下方,支持持续添加更多下拉项
  • 尝试多种方法后始终触发KeyError: 'label_item',原因是Python代码中创建MDDropDownItem时未正确初始化label_item属性

错误原因

MDDropDownItem的label_item是其内部用于显示选中值的核心组件,默认通过KV语言声明完成初始化。如果直接在Python代码中实例化MDDropDownItem却不处理label_item的初始化逻辑,就会触发该KeyError。

解决方案

方式1:用KV语言定义模板动态加载

利用KV语言的默认规则确保MDDropDownItem的label_item被正确初始化,再在Python中动态添加组件实例:

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDRaisedButton
from kivymd.uix.menu import MDDropdownMenu

KV = '''
<DropdownContainer>:
    orientation: "vertical"
    spacing: "10dp"
    padding: "20dp"
'''

class DropdownContainer(MDBoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.add_initial_dropdown()
        self.add_add_button()

    def add_initial_dropdown(self):
        # 通过KV加载确保label_item初始化
        drop_item = Builder.load_string('''
MDDropDownItem:
    text: "选择选项"
''')
        drop_item.bind(on_release=lambda x: MDApp.get_running_app().open_menu(x))
        self.add_widget(drop_item)

    def add_add_button(self):
        add_btn = MDRaisedButton(text="+", size_hint=(None, None), size=(50,50))
        add_btn.bind(on_release=self.add_new_dropdown)
        self.add_widget(add_btn)

    def add_new_dropdown(self, instance):
        self.remove_widget(instance)
        # 用同样方式创建新下拉项
        new_drop = Builder.load_string('''
MDDropDownItem:
    text: "选择选项"
''')
        new_drop.bind(on_release=lambda x: MDApp.get_running_app().open_menu(x))
        self.add_widget(new_drop)
        self.add_add_button()

class TestApp(MDApp):
    def build(self):
        Builder.load_string(KV)
        self.menu = None
        return DropdownContainer()

    def open_menu(self, dropdown_item):
        menu_items = [
            {
                "text": f"选项 {i}",
                "viewclass": "OneLineListItem",
                "on_release": lambda x=f"选项 {i}": self.set_item(x, dropdown_item),
            } for i in range(1, 5)
        ]
        self.menu = MDDropdownMenu(
            caller=dropdown_item,
            items=menu_items,
            width_mult=4,
        )
        self.menu.open()

    def set_item(self, text, dropdown_item):
        dropdown_item.set_item(text)
        self.menu.dismiss()

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

方式2:纯Python手动初始化label_item

如果不想依赖KV语言,可以在Python中手动创建label_item并赋值给MDDropDownItem的对应属性:

from kivymd.uix.label import MDLabel

# 创建新下拉项时手动初始化label_item
new_drop = MDDropDownItem(text="选择选项")
new_drop.label_item = MDLabel(text=new_drop.text, halign="left")
new_drop.add_widget(new_drop.label_item)

将这段代码替换方式1中创建new_drop的逻辑,同样可以解决KeyError问题。

核心逻辑

两种方案的本质都是确保MDDropDownItem的label_item属性被正确初始化——要么借助KV语言的默认组件规则,要么手动在Python中创建该组件并完成绑定。

内容的提问来源于stack exchange,提问作者Luca della Sciucca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:32:46