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

KivyMD 2.0.1dev0中MDDropdownMenu异常问题求助

问题分析与解决

环境

  • KivyMD 2.0.1dev0
  • Python 3.9

代码片段

main.py

screen_list = '''
ScreenManager:
    id: sm
    
    LoginPage:
        id: login_page
        name: 'login_page'        
'''


class LiferApp(MDApp):
    def build(self):
        App.title = "LiferApp"
        Window.size = (393, 851)
        return Builder.load_string(screen_list)


if __name__ == '__main__':
    LiferApp().run()

login_page.kv

<LoginPage>

    FloatLayout:
        adaptive_size: True
        canvas:
            Color:
                rgba: 255/255, 255/255, 255/255, 1
            Rectangle:
                size: self.size
                pos: self.pos


        MDIconButton:
            id: cfg
            style: 'standard'
            icon: 'cog'
            theme_icon_color: "Custom"
            pos_hint: {'center_x': .9, 'center_y': .95}
            on_release: root.config_button_click()

        Widget:
            id: button_back
            size_hint: .35, .04
            pos_hint: {'center_x': .3, 'center_y': .7}
            md_bg_color: 'blue'
            opacity: .5
            canvas:
                Color:
                    rgba: 10/255, 67/255, 126/255, 1
                RoundedRectangle:
                    pos: self.pos
                    size: self.size

LoginPage对应Python文件

Builder.load_file('kv/login_page.kv')


class LoginPage(Screen):

    def config_button_click(self):
        menu_items = [
            {'text': 'About', 'on_release': lambda x='1': self.about_open()},
            {'text': 'Tech', 'on_release': lambda x='2': self.tech_page_open()},
            {'text': 'Contacts', 'on_release': lambda x='3': self.contacts_page_open()},
        ]

        self.cfg_menu = MDDropdownMenu(caller=self.ids.cfg, items=menu_items)
        self.cfg_menu.open()

问题描述

  1. 点击MDIconButton时程序崩溃,报错:

ValueError: MDDivider.md_bg_color accept only str

  1. 若在menu_items中添加viewclass='MDListItem',菜单可打开但无文本显示(修改文本颜色也无效)。

原因分析与解决方案

1. 崩溃问题原因与解决

KivyMD 2.0.1dev0版本中,MDDropdownMenu默认使用MDDropdownItem作为viewclass,菜单内部会自动插入MDDivider组件。该版本对MDDivider.md_bg_color属性做了严格限制,仅接受字符串格式的颜色值(如'rgba(0,0,0,0.1)'),但默认逻辑中可能使用了元组格式的颜色值,触发类型错误。

解决方案:
创建MDDropdownMenu时,显式指定divider_color为字符串格式的颜色值,同时明确指定viewclass(可选,避免歧义):

self.cfg_menu = MDDropdownMenu(
    caller=self.ids.cfg,
    items=menu_items,
    viewclass='MDDropdownItem',
    divider_color='rgba(0, 0, 0, 0.1)'
)

2. MDListItem无文本问题原因与解决

MDListItem并非MDDropdownMenu的原生适配组件,它的文本依赖内部嵌套的MDLabel渲染,而MDDropdownMenu默认仅将items中的text字段直接赋值给viewclass的text属性,在该版本中可能存在属性绑定失效,或者文本颜色与背景色一致导致不可见的问题。

解决方案:
优先使用MDDropdownMenu原生适配的MDDropdownItem作为viewclass(即上述崩溃问题的解决方式),它能完美适配菜单的文本显示与交互逻辑。

如果非要使用MDListItem,需要确保文本颜色与背景色形成对比,明确传递文本属性:

menu_items = [
    {
        'text': 'About',
        'text_color': (0, 0, 0, 1),
        'on_release': lambda x='1': self.about_open()
    },
    {
        'text': 'Tech',
        'text_color': (0, 0, 0, 1),
        'on_release': lambda x='2': self.tech_page_open()
    },
    {
        'text': 'Contacts',
        'text_color': (0, 0, 0, 1),
        'on_release': lambda x='3': self.contacts_page_open()
    },
]

self.cfg_menu = MDDropdownMenu(
    caller=self.ids.cfg,
    items=menu_items,
    viewclass='MDListItem'
)

不过这种方式仍可能存在适配问题,推荐优先使用MDDropdownItem。


内容的提问来源于stack exchange,提问作者Максим Игрок

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:27:06