kivy MDToolbar and OneLineListItem

у меня есть код в котором постоянно повторяется:OneLineListItem и MDToolbar. Как мне избавится от большой писанины? (один раз написать и везде применять) Заранее спасибо за любую помощь.

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.properties import ObjectProperty

KV = '''

<ContentNavigationDrawer>:
    orientation: "vertical"
    Screen:
        BoxLayout:
            orientation: "vertical"

            ScrollView:

                MDList:

                    OneLineListItem:
                        id: on1
                        text: "Задачи"
                        on_press:
                            root.nav_drawer.set_state("close")
                            root.screen_manager.current = "screen 1"

                    OneLineListItem:
                        id: on2
                        text: "Цели"
                        on_press:
                            root.nav_drawer.set_state("close")
                            root.screen_manager.current = "screen 2" 

Screen:

    NavigationLayout:

        ScreenManager:
            id: screen_manager

            Screen:
                name: "screen 1"

                BoxLayout:
                    orientation: 'vertical'

                    MDToolbar:
                        id: toolbar
                        title: "Задачи"
                        left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]

            Screen:
                name: "screen 2"
                BoxLayout:
                    orientation:'vertical'

                    MDToolbar:
                        id: toolbar
                        title: "Задачи"
                        left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]


        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer
'''


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

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


TestNavigationDrawer().run()

Ответы (1 шт):

Автор решения: Xyanight

Вот так:

from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.scrollview import ScrollView

from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem

KV = '''
<Item>
    on_press:
        if root.instance_root: root.instance_root.nav_drawer.set_state("close")
        if root.instance_root: root.instance_root.screen_manager.current = "screen 2" 


<ContentNavigationDrawer>:

    MDList:
        id: box


BoxLayout:
    orientation: "vertical"

    MDToolbar:
        id: toolbar
        title: "Задачи"
        pos_hint: {"top": 1}
        left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]

    NavigationLayout:

        ScreenManager:
            id: screen_manager

            Screen:
                name: "screen 1"

                MDLabel:
                    text: 'Screen 1'

            Screen:
                name: "screen 2"

                MDLabel:
                    text: 'Screen 2'

        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                id: content
                screen_manager: screen_manager
                nav_drawer: nav_drawer
'''


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

    def on_start(self):
        instance_content = self.root.ids.content
        for text in ("Задачи", "Цели"):
            self.root.ids.content.ids.box.add_widget(
                Item(text=text, instance_root=instance_content)
            )


class Item(OneLineListItem):
    instance_root = ObjectProperty()


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


TestNavigationDrawer().run()
→ Ссылка