KivyMD NavigationDrawer 在多个屏幕上滑动
Posted
技术标签:
【中文标题】KivyMD NavigationDrawer 在多个屏幕上滑动【英文标题】:KivyMD NavigationDrawer slides over multiple screens 【发布时间】:2021-11-17 12:51:11 【问题描述】:使用 KivyMD MDNavigationLayout,我正在尝试为应用程序制作导航抽屉!我是这样做的,但是我的导航抽屉现在可以跨多个屏幕移动!我只希望它出现在我的 HomeScreen 上,而不是我的 MenuScreen 上!
非常感谢你所做的一切。
KV代码:
MDScreen:
MDNavigationLayout:
ScreenManager:
HomeScreen:
id: home
MDBoxLayout:
orientation: 'vertical'
MDToolbar:
title: 'Navigation Drawer'
left_action_items: [['menu', lambda x: nav_drawer.set_state('toggle')]]
Widget:
MenuScreen:
id: menu
MDNavigationDrawer:
id: nav_drawer
<HomeScreen>:
name: 'home_screen'
MDLabel:
id: label
text: 'Home Screen'
halign: 'center'
MDRaisedButton:
text: 'Menu Screen'
pos_hint: 'center_x':0.5, 'center_y':0.4
on_press: root.manager.current = 'menu_screen'
<MenuScreen>:
name: 'menu_screen'
MDLabel:
text: f'Menu Screen from Home Screen'
halign: 'center'
MDRaisedButton:
text: 'Home Screen'
pos_hint: 'center_x':0.5, 'center_y':0.4
on_press: root.manager.current = 'home_screen'
主屏幕:
菜单屏幕:
【问题讨论】:
【参考方案1】:NavigationDrawer 是一个设计用于跨多个屏幕工作的小部件。它将显示在多个屏幕上。如果我们仔细查看 you.kv
文件,我们可以找出原因。请注意MDNavigationLayout
是如何在您的Screenmanager
上方的。这意味着您的 ScreenManager 下的所有屏幕(基本上管理您的屏幕并允许您在它们之间轻松切换的小部件)都将显示在 NavigationLayout 中。
实际上没有办法将屏幕排除在显示 NavigationDrawer 之外,因为该小部件旨在在其下方的所有屏幕上显示自己
在文档示例中可以看到: https://kivymd.readthedocs.io/en/0.104.1/components/navigation-drawer/[kivymd docs]1
【讨论】:
【参考方案2】:from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
KV = '''
<ContentNavigationDrawer>:
ScrollView:
MDList:
OneLineListItem:
text: "Screen 1"
on_press:
root.nav_drawer.set_state("close")
root.screen_manager.current = "scr 1"
OneLineListItem:
text: "Screen 2"
on_press:
root.nav_drawer.set_state("close")
root.screen_manager.current = "scr 2"
MDScreen:
MDToolbar:
id: toolbar
pos_hint: "top": 1
elevation: 10
title: "MDNavigationDrawer"
left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]
MDNavigationLayout:
x: toolbar.height
ScreenManager:
id: screen_manager
MDScreen:
name: "scr 1"
MDLabel:
text: "Screen 1"
halign: "center"
MDScreen:
name: "scr 2"
MDLabel:
text: "Screen 2"
halign: "center"
MDNavigationDrawer:
id: nav_drawer
ContentNavigationDrawer:
screen_manager: screen_manager
nav_drawer: nav_drawer
'''
class ContentNavigationDrawer(MDBoxLayout):
screen_manager = ObjectProperty()
nav_drawer = ObjectProperty()
class TestNavigationDrawer(MDApp):
def build(self):
return Builder.load_string(KV)
TestNavigationDrawer().run()
https://kivymd.readthedocs.io/en/latest/components/navigationdrawer/#switching-screens-in-the-screenmanager-and-using-the-common-mdtoolbar
【讨论】:
以上是关于KivyMD NavigationDrawer 在多个屏幕上滑动的主要内容,如果未能解决你的问题,请参考以下文章
CoordinatorLayout + AppBarLayout + NavigationDrawer
在 Robotium 中打开 NavigationDrawer 并选择项目的正确方法
KivyMD 错误:ValueError:KivyMD:App 对象必须在加载根小部件之前进行初始化