KivyMD开发中MDNavigationDrawer打开操作疑似执行两次问题求助
问题原因
代码的核心错误是main类build方法中重复创建窗口管理器实例,导致KV文件绑定的UI对象和实际运行的对象不匹配,逻辑调用混乱才会出现事件疑似被触发两次、抽屉无法打开的问题。
你在build中先通过Builder.load_file('main.kv')加载了KV文件,KV第一行就定义了WindowManager:实例,已经内置了配置好UI的LoginWindow和HomeWindow,但你又额外创建了一个空的WindowManager实例,手动添加了两个没有绑定UI规则的空白页面,最后返回了这个空白实例,所有KV里定义的ID、事件绑定都没有生效。
修复方案
1. 修改Python代码的build方法
直接返回KV加载得到的窗口管理器实例即可,无需重复创建:
from kivymd.app import MDApp from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen from kivymd.uix.boxlayout import MDBoxLayout class LoginWindow(Screen): pass class HomeWindow(Screen): pass class WindowManager(ScreenManager): pass class ContentNavigationDrawer(MDBoxLayout): pass class main(MDApp): def __init__(self, **kwargs): self.title = "APP" super().__init__(**kwargs) def build(self): self.theme_cls.theme_style = "Dark" # 直接返回KV加载生成的WindowManager实例 return Builder.load_file('main.kv') if __name__ == '__main__': main().run()
2. 可选优化(避免偶发重复触发)
如果修改后还是出现抽屉打开异常,可以将KV文件中工具栏的菜单点击逻辑做状态判断,避免重复调用:
找到MDToolbar的left_action_items配置,修改为:
left_action_items: [['menu', lambda x: nav_drawer.set_state("open") if nav_drawer.state == "close" else None]]
也可以直接用toggle参数自动切换状态:
left_action_items: [['menu', lambda x: nav_drawer.set_state("toggle")]]
修改完成后运行代码,导航抽屉即可正常打开。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

