在 Kivy 中导航屏幕

时间:2021-07-07 18:41:49

标签: python kivy kivymd

我正在尝试浏览我的应用程序,我可以通过导航抽屉更改屏幕,但是当我在远离导航抽屉的其中一个屏幕内时,我不知道如何更改到另一个屏幕.

下面的应用程序允许用户点击导航抽屉中的“转到元素 1”按钮,这将把他们带到“元素 1 屏幕”,这个屏幕远离导航抽屉,它有一个可点击的 MDCard。

当用户点击该 MDCard 时,它应该将他们带到“元素 2 屏幕”,但这就是我被卡住的地方。我不知道如何让 kivy 在这里更改屏幕。如何获取元素 1 中的 MdCard 以将屏幕切换到元素 2?

该应用程序被排列成 3 个 .py 文件:

  • 1 表示主应用
  • 1 表示 element_1
  • 1 表示 element_2

下面的代码流程是这样的:
Main App --> Element 1 button --> Element 1 screen --> Element 2 screen

PS:下面的代码仅用于训练目的,它代表了我实际应用的总体布局。

主应用代码:

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from element_1 import element_1_screen
from element_2 import element_2_screen


MainNavigation = '''
<ContentNavigationDrawer>:
    ScrollView:
        MDList:
            OneLineListItem:
                text: 'Go to Element 1'
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "go_to_element_1_screen"

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

        ScreenManager:
            id: screen_manager
            Screen:
                name: "words_nav_item"
            element_1_screen:
                name: "go_to_element_1_screen"
            element_2_screen:
                name: "go_to_element_2_screen"


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


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


class mainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Red"
        return Builder.load_string(MainNavigation)


mainApp().run()

元素 1 屏幕:

from kivy.lang import Builder
from kivymd.uix.screen import Screen

element_1_contents = '''
MDScreen:
    MDCard:
        orientation: 'vertical'
        size_hint: None, None
        size: "360dp", "360dp"
        pos_hint: {"center_x": .5, "center_y": .5}
        ripple_behavior: True
        focus_behavior: True
        on_press: root.screen_manager.current = "go_to_element_2_screen"
        
        MDLabel:
            text: "Welcome to Element 1"
            halign: 'center'
           
        MDLabel:
            text: "Click here to go to element 2"
            halign: 'center'

'''

class element_1_screen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.directory = Builder.load_string(element_1_contents)
        self.add_widget(self.directory)

元素 2 屏幕:

# Element 2 has the same code as element 1 except that for these two lines

MDLabel:
    text: "Welcome to Element 2"

MDLabel:
    text: "Click here to go to element 3"

1 个答案:

答案 0 :(得分:0)

让它工作的一个技巧是改变:

root.screen_manager.current =

到:

root.parent.manager.current =

element_1.pyelement_2.py 文件中。