如何让 KivyMD Navigation Drawer 在单独的 .py 文件中调用另一个应用程序?

How do I get KivyMD Navigation Drawer to call another app in a separate .py file?

我知道如何用 kivy 编写应用程序,我知道如何制作具有导航抽屉的 KivyMD 应用程序。我可以单独制作应用程序 运行,但如何将两者结合起来?

我是编码新手,被困在这里。以下是两个仅用于培训目的的模型应用程序的代码。第一个是一个非常简单的应用程序,称为“+5 游戏”,允许用户单击一个按钮将 5 添加到总数中,然后显示在 GUI 中。

第二个是 KivyMD 应用程序,带有包含两个按钮的导航抽屉。一个转到主屏幕,一个转到“+5 游戏”

如何link导航中的按钮绘制到+5游戏? 我该如何处理文件顶部的导入?

这是 +5 游戏的代码:

from kivymd.app import MDApp
from kivymd.uix.screen import Screen
from kivymd.uix.label import MDLabel
from kivymd.uix.button import MDRectangleFlatButton


class ClickToAdd(MDApp):
    def build(self):
        self.screen = Screen()
        self.num = 0

        self.display_number = MDLabel(text="0", font_style="H1", halign="center",
                                      pos_hint={'center_x': 0.5, 'center_y': 0.8})
        self.add5_BTN = MDRectangleFlatButton(text="+5", pos_hint={'center_x': 0.5, 'center_y': 0.65},
                                              on_release=self.add5_CMD)

        self.screen.add_widget(self.display_number)
        self.screen.add_widget(self.add5_BTN)

        return self.screen

    def add5_CMD(self, *args):
        self.num = self.num + 5
        self.display_number.text = str(self.num)


ClickToAdd().run()

这是带有导航抽屉和屏幕管理器的 KivyMD 应用程序的主 GUI:

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

KV = '''
<ContentNavigationDrawer>:
    ScrollView:
        MDList:
            OneLineListItem:
                text: "Home"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "home"

            OneLineListItem:
                text: "Play +5 Game"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "plus5game"


Screen:
    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "Navigation Drawer Test"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]

    MDNavigationLayout:
        x: toolbar.height
        ScreenManager:
            id: screen_manager
            Screen:
                name: "home"
                MDLabel:
                    text: "Home Screen Stuff Goes Here"
                    halign: "center"

            Screen:
                name: "plus5game"
                MDLabel:
                    text: "+5 Game Goes here"
                    halign: "center"

        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer
'''


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


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


TestNavigationDrawer().run()

你不能 运行 一个 App 在另一个 App 里面,但是你可以在第一个 App 里面使用另一个 App 的内脏。在您的情况下,您可以像这样重新定义 Plus5 App

from kivymd.app import MDApp
from kivymd.uix.screen import Screen
from kivymd.uix.label import MDLabel
from kivymd.uix.button import MDRectangleFlatButton

class Plus5Screen(Screen):
    def __init__(self, **kwargs):
        super(Plus5Screen, self).__init__(**kwargs)
        self.num = 0

        self.display_number = MDLabel(text="0", font_style="H1", halign="center",
                                      pos_hint={'center_x': 0.5, 'center_y': 0.8})
        self.add5_BTN = MDRectangleFlatButton(text="+5", pos_hint={'center_x': 0.5, 'center_y': 0.65},
                                              on_release=self.add5_CMD)

        self.add_widget(self.display_number)
        self.add_widget(self.add5_BTN)

    def add5_CMD(self, *args):
        self.num = self.num + 5
        self.display_number.text = str(self.num)


class ClickToAdd(MDApp):
    def build(self):
        self.screen = Plus5Screen()
        return self.screen

if __name__=='__main__':
    ClickToAdd().run()

并保存这是一个名为 plus5.py 的文件。

然后在你的主 App 中,你可以在 'kv':

中引用它
KV = '''
#:import Plus5Screen plus5   # import the guts of the Plus5 game
<ContentNavigationDrawer>:
    ScrollView:
        MDList:
            OneLineListItem:
                text: "Home"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "home"

            OneLineListItem:
                text: "Play +5 Game"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "plus5game"


Screen:
    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "Navigation Drawer Test"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]

    MDNavigationLayout:
        x: toolbar.height
        ScreenManager:
            id: screen_manager
            Screen:
                name: "home"
                MDLabel:
                    text: "Home Screen Stuff Goes Here"
                    halign: "center"

            Plus5Screen:  # this creates the guts of the Plu5 game
                name: "plus5game"

        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer
'''