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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:45:03