首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >屏幕管理器内部的屏幕管理器,从内部屏幕管理器访问屏幕。

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

Stack Overflow用户
提问于 2020-03-06 12:33:16
回答 1查看 205关注 0票数 0

我的GUI包括一个标题栏,其中一个按钮控制一个屏幕管理器,然后是实际的屏幕管理器,还有一个底部的栏,状态更新。

通常我控制中间的屏幕和顶部的按钮。很简单。现在我的问题是,其中一个屏幕已经非常复杂了,我有一个问题,我有太多的缩进。所以,我们来看看:--我希望在另一个屏幕管理器sm1中有一个屏幕管理器sm2,从sm2中从sm1访问屏幕。

我试图用下面的语法重新创建我的问题,我希望我没有忘记任何重要的东西。我试着玩动态类之类的,但是我的代码被链接到了很多用root.functions访问的python代码,但是它没有很好的工作。

Kivy语法:

代码语言:javascript
复制
    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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-11 13:58:38

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

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

代码语言:javascript
复制
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的代码

代码语言:javascript
复制
    Button:
        text: 'Go to Screen 1'
        on_release: sm1.current = 'outerScreen1'

将失败,因为outerScreen1不再是sm1的子代。因此,如果您想要走这条路线,您必须跟踪outerScreen1在哪里,并根据需要更改它的父级。

这是一个很好的时间来考虑,仅仅制作另一个复制了ScreenouterScreen1是否会更简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60564166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档