KivyMD NavigationDrawerIconButtons не отображаются - PullRequest
1 голос
/ 10 января 2020

Newb ie вот так, я извиняюсь, если идея, которую я пробую, немного не в порядке.

Итак, я пытаюсь создать приложение, используя KivyMD, и я уже мимо части, где вы можете разблокировать приложение, а затем перейти к экрану, который содержит навигационный ящик. Однако, поскольку (в отличие от примера, приведенного для приложения NavigationDrawer здесь https://github.com/HeaTTheatR/KivyMD/wiki/Components-Navigation-Drawer, где NavigationDrawer - это фактический root класса 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 на другом экране (не root) и мне кажется, что мне придется внести некоторые изменения в эту часть:

`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» в моем коде) работал так же, как пример в документации. Вся помощь очень ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...