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

如何在KivyMD与Python中使用图标及更新下拉菜单项文本?

解决方案

1. 图标不显示问题

OneLineIconListItem的左侧图标属性是leading_icon,而非你使用的icon,属性名错误导致图标无法渲染。修改menu_items里的对应键即可:

menu_items = [
    {
        "viewclass": "OneLineIconListItem",
        "leading_icon": "language-python",  # 替换原"icon"为"leading_icon"
        "text": "Set Off",
        "on_release": lambda item: self.callback(item),
        "height": dp(self.item_height),
        "divider": None
    }
]

2. 文本切换问题

你之前修改字典里的text无效,因为MDDropdownMenu实例化后,原始字典仅作为控件初始化配置,实际显示的是控件实例的text属性。需要直接操作回调传入的控件实例来更新文本:

def callback(self, item):
    # 切换文本状态
    if item.text == "Set Off":
        item.text = "Set On"
    else:
        item.text = "Set Off"
    print(item.text)

完整修改代码

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu
from kivy.metrics import dp

kv = """
Screen:
    MDIconButton:
        id: button
        icon: "dots-vertical"
        pos_hint: {"x": .2, "y": .8}
        _no_ripple_effect: True
        on_release: app.dropdown.open()
"""

class DemoApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.item_height = 50
        self.screen = Builder.load_string(kv)

        menu_items = [
            {
                "viewclass": "OneLineIconListItem",
                "leading_icon": "language-python",
                "text": "Set Off",
                "on_release": lambda item: self.callback(item),
                "height": dp(self.item_height),
                "divider": None
            }
        ]

        self.dropdown = MDDropdownMenu(
            items=menu_items, 
            width_mult=4,
            caller=self.screen.ids.button,
            max_height=len(menu_items) * dp(self.item_height),
        )

    def build(self):
        self.theme_cls.theme_style = "Dark"
        self.theme_cls.primary_palette = "Orange"
        return self.screen

    def callback(self, item):
        if item.text == "Set Off":
            item.text = "Set On"
        else:
            item.text = "Set Off"
        print(item.text)

DemoApp().run()

关键说明

  • 图标属性:OneLineIconListItem左侧图标用leading_icon,右侧图标用trailing_icon,你之前的属性名匹配错误导致图标留白但不显示。
  • 文本更新:必须直接操作控件实例的text属性,修改初始化用的字典不会同步到已渲染的控件上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:55:17