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

KIVY项目导入navigationdrawer报KeyError,如何实现侧边导航抽屉

报错原因
  • 触发KeyError: 'kivy.garden.navigationdrawer'的核心原因是你尚未安装对应garden扩展,且该扩展属于已停止维护的旧版Kivy Garden生态,无法适配Kivy 2.0及以上版本。
  • 旧版garden扩展的安装逻辑是先安装garden工具pip install kivy-garden,再执行garden install navigationdrawer才能正常导入,即便完成安装,该废弃组件也大概率会在新版本Kivy中出现运行错误。
原生Kivy实现侧边导航抽屉方案

不需要依赖任何第三方扩展,仅用Kivy自带组件即可实现符合需求的侧边抽屉,核心逻辑是通过位移动画控制侧边菜单的显示/隐藏:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.animation import Animation

class NavDrawer(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 侧边菜单占屏幕30%宽度,默认隐藏在屏幕左侧外
        self.size_hint = (0.3, 1)
        self.pos_hint = {'x': -0.3, 'top': 1}
        self.orientation = 'vertical'
        # 自定义菜单项
        menu_items = ['首页', '内容管理', '设置', '关于', '退出']
        for item in menu_items:
            btn = Button(text=item, size_hint_y=0.1)
            # 可绑定菜单项点击事件
            btn.bind(on_press=lambda x, item=item: self.on_menu_click(item))
            self.add_widget(btn)
    
    def on_menu_click(self, item):
        # 自定义菜单项点击逻辑
        print(f"点击了菜单项:{item}")

class MainContainer(FloatLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.drawer_open = False
        # 加入侧边抽屉
        self.nav_drawer = NavDrawer()
        self.add_widget(self.nav_drawer)
        # 菜单触发按钮
        self.menu_toggle = Button(text='☰', size_hint=(0.1, 0.05), pos_hint={'x': 0.02, 'top': 0.98})
        self.menu_toggle.bind(on_press=self.toggle_drawer)
        self.add_widget(self.menu_toggle)
        # 主内容区可在此处添加你已开发完成的应用主体代码

    def toggle_drawer(self, instance):
        if not self.drawer_open:
            # 滑出抽屉
            Animation(x=0, duration=0.3, t='out_cubic').start(self.nav_drawer)
            self.drawer_open = True
        else:
            # 收回抽屉
            Animation(x=-0.3, duration=0.3, t='in_cubic').start(self.nav_drawer)
            self.drawer_open = False

class MyApp(App):
    def build(self):
        return MainContainer()

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

你可以根据自己的项目需求调整菜单宽度、动画效果、菜单项样式,也可以额外添加点击主内容区收回抽屉的交互逻辑。

内容的提问来源于stack exchange,提问作者Ayushman Rajora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:45:03