Диспетчер экрана внутри диспетчера экрана, доступ к экранам из диспетчера внутреннего экрана - PullRequest
0 голосов
/ 06 марта 2020

My GUI состоит из строки заголовка с кнопками, управляющими диспетчером экрана в середине, затем фактическим диспетчером экрана, и нижней панели с обновлениями статуса.

Обычно я управляю экранами в середине с кнопками сверху. Легко. Теперь моя проблема в том, что один из этих экранов уже очень сложный, и у меня проблема в том, что у меня так много отступов ... Итак, здесь мы go: Я хочу иметь менеджер экрана sm2 внутри другого менеджера экрана sm1 и доступ к экранам из sm1 изнутри sm2 .

Я попытался воссоздать свою проблему с помощью следующего синтаксиса, надеюсь, я не забыл ничего важного. Я пытался поиграть с динамическими c классами и тому подобным, но мой код связан с большим количеством python кода, к которому я обращаюсь с помощью root .functions, и он не вполне работал.

Синтаксис 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 голосов
/ 11 марта 2020

Вы можете делать то, что вы хотите, но это требует отвратительного взлома. Чтобы установить текущий Screen для ScreenManager, этот Screen должен быть дочерним по отношению к ScreenManager. Но любой Widget (включая Screens) может иметь только одного родителя. Таким образом, уродливый хак должен переместить Screen между ScreenManagers по мере необходимости.

Часть измененной версии вашего 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 теперь перемещается outerScreen1 с sm1 на sm2 и становится текущим экраном sm2.

Но теперь код использует sm1:

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

потерпит неудачу, потому что outerScreen1 больше не является потомком sm1. Итак, если вы хотите go этот маршрут, вы должны отслеживать, где находится outerScreen1, и при необходимости менять его родителя.

Это хорошее время, чтобы подумать, просто ли сделать еще один Screen дубликаты outerScreen1 могут быть проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...