屏幕管理器内部的屏幕管理器,可从内部屏幕管理器访问屏幕

时间:2020-03-06 12:33:16

标签: python nested kivy

我的GUI由一个标题栏和一个状态更新的底部栏组成,其中标题栏带有控制中间的屏幕管理器的按钮,然后是实际的屏幕管理器。

通常,我用顶部的按钮控制中间的屏幕。简单。现在我的问题是,这些屏幕之一已经非常复杂,而且我有一个问题,就是我有很多凹痕。.所以,我们开始: 我想在另一个screenmanager sm1中包含一个屏幕管理器sm2,并从sm2中访问来自sm1的屏幕

我尝试使用以下语法重新创建我的问题,希望我不要忘记任何重要的事情。我尝试使用动态类之类的方法,但是我的代码链接到了许多我用root.functions访问的python代码,但效果不佳。

Kivy语法:

    BoxLayout:
        size_hint: 1, 0.1
        Label:
            text: 'Title Bar with Menu'
        Button:
            text: 'Go to Screen 1'
            on_release: sm1.current = 'outerScreen1'
        Button:
            text: 'Go to Screen 2'
            on_release: sm2.current = 'outerScreen2'

    Screenmanager:
        id: sm1
        Screen:
            name: 'outerScreen1'
            BoxLayout:
                Label:
                    text: 'Testlabel'
        Screen:
            name: 'outerScreen2'
            BoxLayout:
                orientation: 'horizontal'
                size_hint: 1, 0.1
                anchor_y: 'top'
                pos_hint: {'top': 1}
                Label:
                    text: 'Title Bar inside outerScreen2'
                Button:
                    text: 'Go to innerscreen Home'
                    on_release: sm2.current = 'screen2Home'
                Button:
                    text: 'Go to innerscreen Meow'
                    on_release: sm2.current = 'screen2Meow'
                Button:
                    text: 'Go to outerscreen 1, but inside screenmanager sm2'
                    on_release: sm2.current = 'outerScreen1' **#This is where the problem is**

            BoxLayout:
                orientation: 'horizontal'
                size_hint: 1, 0.9
                ScreenManager:
                    id: sm2
                    Screen:
                        name: 'screen2Home'
                        Label:
                            text: 'simple test'
                    Screen:
                        name: 'screen2Meow'
                        Label:
                            text: 'I meow sometimes'

1 个答案:

答案 0 :(得分:0)

您可以做您想做的事,但这需要一个难看的技巧。为了设置Screen的当前ScreenManager,该Screen必须是ScreenManager的子元素。但是任何Widget(包括Screens)只能有一个父母。因此,丑陋的做法是根据需要在Screen之间移动ScreenManagers

kv的一部分修改版本实现了部分hack:

ScreenManager:
    id: sm1
    Screen:
        id: outer_screen_1  # added id
        name: 'outerScreen1'
        BoxLayout:
            Label:
                text: 'Testlabel'
    Screen:
        name: 'outerScreen2'
        BoxLayout:
            orientation: 'horizontal'
            size_hint: 1, 0.1
            anchor_y: 'top'
            pos_hint: {'top': 1}
            Label:
                text: 'Title Bar inside outerScreen2'
            Button:
                text: 'Go to innerscreen Home'
                on_release: sm2.current = 'screen2Home'
            Button:
                text: 'Go to innerscreen Meow'
                on_release: sm2.current = 'screen2Meow'
            Button:
                text: 'Go to outerscreen 1, but inside screenmanager sm2'
                on_release:
                    # use saved id to move Screen between ScreenManagers
                    sm1.remove_widget(outer_screen_1)
                    sm2.add_widget(outer_screen_1)
                    # now we can use this Screen with sm2
                    sm2.current = 'outerScreen1' #This is where the problem is

我已将id添加到outerScreen1。并且在问题区域中,on_release代码现在将outerScreen1sm1移到sm2,并使其成为sm2的当前屏幕。

但是现在使用sm1的代码:

    Button:
        text: 'Go to Screen 1'
        on_release: sm1.current = 'outerScreen1'

将失败,因为outerScreen1不再是sm1的子级。因此,如果要走这条路,必须跟踪outerScreen1的位置,并根据需要更改其父级。

现在是考虑是否仅制作另一个Screen重复的outerScreen1可能会更简单的时候。