【问题标题】:screen manager inside screen manager, accesss screens from inner screen manager屏幕管理器内的屏幕管理器,从内部屏幕管理器访问屏幕
【发布时间】:2020-03-06 12:33:16
【问题描述】:

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

通常我用顶部的按钮控制中间的屏幕。简单。现在我的问题是,其中一个屏幕已经非常复杂了,而且我有一个问题是我有这么多的缩进......所以,我们开始吧: 我想在另一个屏幕管理器 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'

【问题讨论】:

  • 只是将sm2 更改为sm1(在您标记的行中)是否符合您的要求?
  • 嘿 - 不幸的是没有。如果我这样做,它会在外部屏幕管理器中显示内容,并且我会丢失内部屏幕元素(在此示例中没有)。所以我有一个内部菜单栏,我想在从外部屏幕管理器访问屏幕时拥有它。
  • accessing screens from the outer screen manager是什么意思?
  • 在 sm2 中显示 sm1.outerScreen1。

标签: python nested kivy


【解决方案1】:

你可以做你想做的事,但它需要一个丑陋的 hack。为了设置ScreenManager 的当前ScreenScreen 必须是ScreenManager 的子代。但是任何Widget(包括Screens)都只能有一个父级。因此,丑陋的 hack 是根据需要在 ScreenManagers 之间移动 Screen

您的kv 的修改版本的一部分实现了部分破解:

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的位置,并根据需要更改其父级。

现在是考虑是否只创建另一个与outerScreen1 重复的Screen 是否更简单的好时机。

【讨论】:

  • 感谢您抽出宝贵时间,我刚刚复制了屏幕。也许我以后会抽出一些时间来考虑更多。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多