如何使用KivyMD在NavigationDrawer中的屏幕之间切换

时间:2020-07-21 16:10:33

标签: python kivy kivymd

我是使用kivymd的初学者,并尝试使用KivyMD在NavigationDrawer中的屏幕之间切换,我正在阅读一些文档,并最终获得了这段代码,但它对我不起作用:

from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivymd.theming import ThemableBehavior
from kivymd.uix.list import MDList
from kivymd.app import MDApp



Window.size = (300, 500)
navigation_helper = """
Screen:
    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "MDNavigationDrawer"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]
        
    NavigationLayout:
        x: toolbar.height

        ScreenManager:
            id: screen_manager

            Screen:
                name: "scr 1"

                MDLabel:
                    text: "Go to Hell"
                    halign: "center"

            Screen:
                name: "scr 2"

                MDLabel:
                    text: "Hell"
                    halign: "center"

        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer
           
                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"


"""



class DemoApp(MDApp):
    class ContentNavigationDrawer(BoxLayout):
        screen_manager = ObjectProperty()
        nav_drawer = ObjectProperty()

    class DrawerList(ThemableBehavior, MDList):
        pass

    def build(self):
        screen = Builder.load_string(navigation_helper)
        return screen

    def on_start(self):
        pass


DemoApp().run()

但是它给了我这个错误“ AttributeError:'Screen'对象没有属性'nav_drawer'“,我不确定自己做错了什么。

1 个答案:

答案 0 :(得分:0)

在定义id的同一规则中使用id引用对象时,不需要在其前面加上root

                    OneLineListItem:
                        text: "Screen 1"
                        on_press:
                            nav_drawer.set_state("close")
                            screen_manager.current = "scr 1"

                    OneLineListItem:
                        text: "Screen 2"
                        on_press:
                            nav_drawer.set_state("close")
                            screen_manager.current = "scr 2"