Добавление функций в панель навигации по контенту - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь добавить функции в свой ящик навигации kivymd, но не могу найти способ сделать это. Я хочу, чтобы элементы писали разные страницы. Например, элемент настроек должен открывать страницу настроек при нажатии. я использую новую обновленную версию kivymd 0.103.0

это пример кода

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty



class TestNavigationDrawer(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        icons_item = {
            "folder": "My files",
            "account-multiple": "Shared with me",
            "star": "Starred",
            "history": "Recent",
            "checkbox-marked": "Shared with me",
            "upload": "Upload",
        }
        for icon_name in icons_item.keys():
            self.root.ids.content_drawer.ids.md_list.add_widget(
                ItemDrawer(icon=icon_name, text=icons_item[icon_name])
            )

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Другой способ - просто удалить метод on_start () из класса TestNavigationDrawer () и записать код в файл .kv ScrollView для переключения с одной страницы на другую. Я только начал изучать, поэтому мой код может быть неоптимальным, но он полностью соответствует упомянутому вопросу. т.е. я вставляю полный код

, используйте образец кода, как указано ниже:

main.py

from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty

from kivymd.app import MDApp
from kivymd.theming import ThemableBehavior
from kivymd.uix.list import OneLineIconListItem, MDList
from kivymd.theming import  ThemeManager

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


class DrawerList(ThemableBehavior, MDList):
    def set_color_item(self, instance_item):
        '''Called when tap on a menu item.'''
        # Set the color of the icon and text for the menu item.
        for item in self.children:
            if item.text_color == self.theme_cls.primary_color:
                item.text_color = self.theme_cls.text_color
                break
        instance_item.text_color = self.theme_cls.primary_color


class ItemDrawer(OneLineIconListItem):
    icon = StringProperty()


class DrawerList(ThemableBehavior, MDList):
    def set_color_item(self, instance_item):
        """Called when tap on a menu item."""

        # Set the color of the icon and text for the menu item.
            for item in self.children:
                if item.text_color == self.theme_cls.primary_color:
                item.text_color = self.theme_cls.text_color
                break
        instance_item.text_color = self.theme_cls.primary_color



#GUI = Builder.load_file(r"C:\Users\main.kv")
class MainApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.theme_cls = ThemeManager()

    def build(self):
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_palette = "Green"
        self.theme_cls.primary_hue = "200"
        #return GUI


MainApp().run()

main.kv

#: include navigationdrawer.kv

Screen:
    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "Anything"
        left_action_items: [["menu", lambda x: nav_drawer.toggle_nav_drawer()]]

    NavigationLayout:
        x: toolbar.height

        ScreenManager:
            id: screen_manager

            Screen:
                name: "scr 0"
                MDLabel:
                    text: "Screen 0"
                    halign: "center"

            Screen:
                name: "scr 1"
                MDLabel:
                    text: "Screen 1"
                    halign: "center"
            Screen:
                name: "scr 2"
                MDLabel:
                    text: "Screen 2"
                    halign: "center"


        MDNavigationDrawer:
            id: nav_drawer
            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer

navigationdrawer.kv

<ItemDrawer>:
    theme_text_color: "Custom"
    on_release:
        print("HI IM Pringint" )
        self.parent.set_color_item(self)

    IconLeftWidget:
        id: icon
        icon: root.icon
        theme_text_color: "Custom"
        text_color: root.text_color


<ContentNavigationDrawer>:
    orientation: "vertical"
    padding: "8dp"
    spacing: "8dp"

    AnchorLayout:
        anchor_x: "left"
        size_hint_y: None
        height: avatar.height

       Image:
            id: avatar
            #size_hint: None, None
            #size: "300dp", "300dp"
            source: "img/tiger.jpg"

    MDLabel:
        text: "All Starts Here!"
        font_style: "Button"
        size_hint_y: None
        height: self.texture_size[1]

    MDLabel:
        text: "Adding green energy to your life..."
        font_style: "Caption"
        size_hint_y: None
        height: self.texture_size[1]

    ScrollView:

#        DrawerList:
#            id: md_list

        MDList:
            id: md_list
            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"

Спасибо, надеюсь, это поможет!

0 голосов
/ 18 февраля 2020

Как сказал Лотри c, вам нужно добавить атрибут 'on_release' в экземпляр ItemDrawer. Значением этого атрибута должна быть любая функция, которую вы хотите вызывать при нажатии кнопки (обычно лямбда, если используется обратный вызов метода).

Не то, чтобы вы спрашивали, но у KivyMD есть демонстрационное приложение "kitchensink" в GitLab, которое служит для демонстрации функциональности некоторых их виджетов. Вот ссылка

...