如何在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
相关产品推荐
相关产品推荐

