更新Kivy后运行KivyMD项目报Unknown class <NavigationLayout>错误
报错根因
这个报错和Kivy核心库的版本更新没有直接关系,通常是更新Kivy过程中,连带将KivyMD升级到了1.0.0及以上版本——这个版本开始,KivyMD彻底移除了旧版NavigationLayout组件,组件工厂库里没有注册这个类,才会在KV加载时抛出Unknown class <NavigationLayout>的异常。
可选解决方案
方案1:适配新版KivyMD组件(推荐)
旧版导航结构的嵌套逻辑已经重构,NavigationLayout的功能现在完全由MDNavigationLayout承担,需要做两处核心调整:
- 把KV结构里的
NavigationLayout替换为MDNavigationLayout - 按照新组件的交互要求,在
MDNavigationLayout内部先声明主内容承载容器(旧版NavigationLayout会自动生成主内容层,新版需要手动添加,不然会出现抽屉无法拖动关闭、主内容被完全遮挡的交互问题)
修正后的完整可运行代码如下:
from kivy.lang import Builder from kivymd.app import MDApp from kivy.core.window import Window Window.size = (600,550) KV = ''' Screen: MDNavigationLayout: # 新增主内容承载容器,替换为实际业务需要的布局即可 ScreenManager: Screen: # 主页面内容示例 MDLabel: text: "主内容区" halign: "center" # 原有抽屉部分结构保持不变 MDNavigationDrawer: id: draver BoxLayout: orientation: 'vertical' ScrollView: MDList: BoxLayout: id: box OneLineIconListItem: on_press: app.star() text: 'Избранное' IconLeftWidget: icon: 'star' OneLineIconListItem: text: 'Настройки' IconLeftWidget: icon: 'settings' ''' class Test(MDApp): def build(self): return Builder.load_string(KV) Test().run()
方案2:回退KivyMD版本匹配旧代码
如果不想改动现有业务代码,可以直接将KivyMD降级回最后一个保留NavigationLayout组件的稳定版本,执行安装命令:pip install kivymd==0.104.3
注意:该版本已停止官方维护,和最新版Kivy、Python环境的兼容性可能存在未知问题,仅作为临时应急方案使用。
内容的提问来源于stack exchange,提问作者Mirai
相关产品推荐
相关产品推荐

