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()
问题描述
- 点击MDIconButton时程序崩溃,报错:
ValueError: MDDivider.md_bg_color accept only str
- 若在
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,提问作者Максим Игрок
相关产品推荐
相关产品推荐

