
本文详解如何在 kivymd 应用中指定启动时默认显示的 screen(如 homescreen),避免误加载其他页面;同时说明如何自定义 mdbottomnavigation 的图标与文字显示模式,实现纯文本菜单或隐藏图标等 ui 需求。
在 KivyMD 的 MDBottomNavigation 架构中,应用启动时默认显示哪个屏幕,不由 KV 文件中的顺序决定,而完全取决于 ScreenManager 实例中第一个被添加的 Screen 对象。当前代码中,ShopScreen(name='menu') 被最先加入 ScreenManager,因此程序启动后自动显示“МАГАЗИН”页——这正是问题根源。
✅ 正确设置默认启动屏幕
需将目标屏幕(如 HomeScreen)作为 ScreenManager 的首个子控件添加。同时,ScreenManager 必须作为 build() 方法的最终返回值(而非 WindowManager),否则 KV 中定义的导航结构无法正确绑定到管理器上。修正后的 main.py 关键部分如下:
class MainApp(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
sm = ScreenManager()
# ✅ 顺序关键:HomeScreen 必须第一个添加 → 启动即显示
sm.add_widget(HomeScreen(name='main'))
sm.add_widget(ItemsScreen(name='items'))
sm.add_widget(ShopScreen(name='menu'))
# ✅ 返回 ScreenManager 本身(非 WindowManager)
Builder.load_file("main.kv")
return sm⚠️ 注意:原代码中 return WindowManager() 会导致 ScreenManager 未被实际使用,KV 文件里嵌套的 HomeScreen 将无法响应导航切换。务必让 ScreenManager 成为根控件。
?️ 自定义底部导航栏:控制图标与文字显示
MDBottomNavigationItem 默认同时显示图标与文字。若需仅显示文字(隐藏图标),可将 icon 属性设为空字符串,并通过 text_color_normal / text_color_active 精细控制颜色:
MDBottomNavigationItem:
icon: '' # ? 关键:清空图标
name: 'main'
text: 'ГОЛОВНА'
HomeScreen:若需仅显示图标(隐藏文字),则保留 icon,并将 text 设为空字符串,并调整 text_color_normal 为透明色(避免占位):
MDBottomNavigationItem:
icon: 'home'
name: 'main'
text: '' # ? 清空文字
text_color_normal: 0, 0, 0, 0 # 完全透明,消除文字占位
HomeScreen:此外,可通过 font_name 统一设置文字字体(如示例中的 Press Start 2P),确保视觉一致性。
? 补充:动态切换屏幕(进阶用法)
在按钮回调或其他逻辑中,可通过 app.root.current = 'screen_name' 直接跳转:
# 例如在 HomeScreen 的某个按钮事件中
def on_shop_button_click(self):
self.manager.current = 'menu' # ✅ 推荐:通过 screen.manager 访问父 ScreenManager该方式安全、简洁,无需全局获取 App 实例,符合 Kivy 推荐实践。
✅ 总结要点
- 启动屏逻辑:ScreenManager.add_widget() 的添加顺序 = 默认显示顺序,首项即启动页;
- 根控件必须是 ScreenManager:返回 sm 而非包装容器(如 WindowManager),否则导航失效;
- 图标/文字控制:icon: '' 隐藏图标,text: '' + text_color_normal: 0,0,0,0 隐藏文字;
- 切换推荐写法:在 Screen 内部使用 self.manager.current = 'xxx',语义清晰且解耦。
按此方案调整后,应用启动将直接进入 HomeScreen,底部导航栏也可按需呈现纯文本或纯图标风格,兼顾功能正确性与 UI 灵活性。










