首页 > 解决方案 > KivyMD NavigationDrawerIconButtons 未出现

问题描述

新手在这里,如果我尝试的想法有点不正常,我深表歉意。

所以,我正在尝试使用 KivyMD 制作一个应用程序,我已经过了可以解锁应用程序然后进入包含导航抽屉的屏幕的部分。但是,因为(与此处为 NavigationDrawer 应用程序给出的示例不同,https://github.com/HeaTTheatR/KivyMD/wiki/Components-Navigation-Drawer其中 NavigationDrawer 是 MDApp 类的实际根)我的应用程序以“解锁”开头" 屏幕,只有在解锁后,才会出现包含 NavigationDrawer 和主屏幕(用于应用程序内容)的屏幕。我的问题是我不能(或者很可能:我不知道如何)在 NavigationDrawer 下添加选项列表。下面是我的实际代码,我很难弄清楚将这部分放在哪里,以便它在 NavigationDrawer 时工作

def on_start(self):
    for items in {
        "home-circle-outline": "Home",
        "update": "Check for Update",
        "settings-outline": "Settings",
        "exit-to-app": "Exit",
    }.items():
        self.root.ids.content_drawer.ids.box_item.add_widget(
            NavigationItem(
                text=items[1],
                icon=items[0],
            )
        )

所以,我在另一个屏幕(不是根)上有 NavigationDrawer,看来我必须对这部分进行一些修改:

`self.root.ids.content_drawer.ids.box_item.add_widget(
                NavigationItem(
                    text=items[1],
                    icon=items[0],
                )
            )`

如果我的应用程序的 .py 代码是下面的代码,我应该把上面提到的代码块放在哪里(用于在 NavigationDrawer 中添加可点击选项的代码块)?

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemeManager
from kivy.uix.screenmanager import Screen, ScreenManager, FloatLayout
from kivymd.uix.list import ILeftBody, OneLineAvatarListItem
from kivymd.toast import toast
from kivy.uix.image import Image



loginscreen_kv = '''

#:import FadeTransition kivy.uix.screenmanager.FadeTransition
#:import Factory kivy.factory.Factory

LoginScreen:
    scr_mngr: scr_mngr
    ScreenManager:
        id: scr_mngr
        screen1: screen1
        transition: FadeTransition()
        orientation: 'vertical'
        canvas:
            Rectangle:
                source: "deku_blur30.png"
                size: self.size
                pos: self.pos

        Screen:
            id: screen1
            name: 'screen1'
            username: username
            password: password

            MDCard:
                size_hint: None, None
                size: dp(520), dp(340)
                pos_hint: {'center_x': 0.5, 'center_y': 0.5}

                BoxLayout:
                    orientation:'vertical'
                    padding: dp(20)
                    spacing:20

                    MDLabel:
                        markup: True
                        text: '[b]Creator Login Credentials[/b] \\n [i]...so you can use the app[/i]'
                        theme_text_color: 'Primary'
                        size_hint_y: None
                        height: dp(36)

                    MDSeparator:
                        height: dp(5)

                    MDTextField:
                        id: username
                        hint_text: "Username "
                        helper_text_mode: "on_focus"

                    MDTextField:
                        id: password
                        hint_text: "Password "
                        helper_text_mode: "on_focus"
                        password: True

                    MDFlatButton:
                        text: "Unlock the App"
                        pos_hint: {'center_x': 0.5}
                        on_release: root.check_data_login()
        MainAppScr:


<MainAppScr>:
    name: 'main_app_scr'
    ScreenManager:
        id: screen_manager1

        Screen:
            name: 'screen1'

            NavigationLayout:
                ScreenManager:
                    id: screen_manager2
                    transition: FadeTransition()
                    Screen:
                        FloatLayout:
                            orientation: 'vertical'
                            canvas:
                                Rectangle:
                                    source: "./dualface.jpeg"
                                    size: self.size
                                    pos: self.pos
                            MDToolbar:
                                title: "HeroAca"
                                background_color: app.theme_cls.primary_dark
                                pos_hint: {"top": 1}
                                elevation: 10
                                left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]


                MDNavigationDrawer:
                    id: nav_drawer
                    # find auto-dismiss function
                    auto_dismiss: True
                    ContentNavigationDrawer:
                        id: content_drawer

# insert NavigationDrawerIconButtons here

<Page2@Screen>:

    name: "screen2"
    FloatLayout:
        size_hint: 0.98, 0.95
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
        canvas:
            Rectangle:
                #source: "./deku.jpg"
                size: self.size
                pos: self.pos

###

<NavigationItem>:
    theme_text_color: 'Custom'
    divider: None

    IconLeftWidget:
        icon: root.icon


<ContentNavigationDrawer>:
    BoxLayout:
        orientation: 'vertical'

        FloatLayout:
            size_hint_y: None
            height: "200dp"

            canvas:
                Color:
                    rgba: app.theme_cls.primary_color
                Rectangle:
                    #source: './deku.jpg'
                    pos: self.pos
                    size: self.size

            # this is for the logo area of the drawer (inside the FloatLayout)
            BoxLayout:
                id: top_box
                size_hint_y: None
                height: "360dp"
                padding: "10dp"
                x: root.parent.x
                pos_hint: {"top": 1}

                Image:
                    # line below is for reference of how the original example mapped the kivymd logo
                    source: f"{images_path}kivymd_alpha.png"
                    #source: "./deku_transp.png"

            MDIconButton:
                icon: "close"
                x: root.parent.x + dp(10)
                pos_hint: {"top": 1}
                on_release: root.parent.toggle_nav_drawer()

            MDLabel:
                markup: True
                text: "[b]Teppy's Test App[/b]\\nVersion: 0.1"
                pos_hint: {'center_y': .5}
                pos_hint: {'top': .75}
                x: root.parent.x + dp(10)
                y: root.height - top_box.height + dp(10)
                size_hint_y: None
                height: self.texture_size[1]

        ScrollView:
            pos_hint: {"top": 1}

            GridLayout:
                id: box_item
                cols: 1
                size_hint_y: None
                height: self.minimum_height
'''



class MainAppScr(Screen):
    pass

class ContentNavigationDrawer(BoxLayout):
    pass

class NavigationItem(OneLineAvatarListItem):
    icon = StringProperty()


class LoginScreen(FloatLayout):

    scr_mngr = ObjectProperty(None)

    def check_data_login(self):
        username = self.scr_mngr.screen1.username.text
        password = self.scr_mngr.screen1.password.text

        print(username)
        print(password)

        if username == "" and password == "": # set a username and pw to unlock the app
            self.change_screen("main_app_scr")

    def change_screen(self, screen, *args):
        self.scr_mngr.current = screen



class MyHeroAcademia(MDApp):
    title = "MyHeroAcademia App"
    def __init__(self, **kwargs):
        self.theme_cls.primary_palette = "Teal"
        self.theme_cls.primary_accent = "BlueGray"
        super().__init__(**kwargs)

    def build(self):
        return Builder.load_string(loginscreen_kv)


# find a way to get this to the nav drawer
"""
    def on_start(self):
        for items in {
            "home-circle-outline": "Home",
            "update": "Check for Update",
            "settings-outline": "Settings",
            "exit-to-app": "Exit",
        }.items():
            self.root.ids.content_drawer.ids.box_item.add_widget(
                NavigationItem(
                    text=items[1],
                    icon=items[0],
                )
            )
"""



if __name__ =="__main__":
    MyHeroAcademia().run()

一般来说,我想让 NavigationDrawer(我的代码上的“MainAppScr”)屏幕像文档中的示例一样工作。非常感谢所有帮助!

标签: androidpython-3.xkivymaterial-design

解决方案


推荐阅读