Изменение экранов в Python без класса Screen Manager - PullRequest
0 голосов
/ 29 октября 2018

Я использую жесты на всех своих экранах, и я не могу использовать класс диспетчера экрана для управления своими экранами, или я так полагаю. Я могу перемещаться по файлу .kv, используя manger.current = 'some_screeen', но не могу в файле .py.

Я пытался Runner().ids.manager.current = 'some_screen' в .py файле, но он не работает. Там даже не выдается ошибка. Экран вообще не меняется.

Основной кодекс (для краткости):

class Runner(gesture.GestureBox):
    pass

MyApp(App):
    def build(self):
        return Runner()

Затем в файле KV я создаю менеджер экрана.

<Runner>:
    ScreenManager:
        id: manager

        Screen:
            name: 'main_screen'
            Button:
                on_press:
                    manager.current = 'screen1'
        Screen:
            name: 'screen1'
            Button:
                on_press:
                    manager.current = 'home_screen'

1 Ответ

0 голосов
/ 30 октября 2018

Я пробовал Runner (). Ids.manager.current = 'some_screen' в файле .py, но он не работает. Там даже не выдается ошибка. Экран вообще не меняется.

Работает отлично, просто не делает то, во что вы верите. Когда вы пишете Runner(), вы получаете новый экземпляр класса Runner с его собственными дочерними элементами, включая собственный ScreenManager. Этот не имеет ничего общего с тем, который вы отображаете в графическом интерфейсе. Когда вы устанавливаете свойство current, ScreenManager покорно меняет экран, просто у вас нет возможности это увидеть.

На самом деле вы хотите изменить current свойство виджета, отображаемого в вашем графическом интерфейсе. Лучший способ сделать это зависит от контекста, который вы пропустили (всегда старайтесь привести пример с полным выполнением, не ясно, как выглядел ваш ошибочный код). Однако в этом случае экземпляр Runner является вашим корневым виджетом, который доступен с App.get_running_app().root, поэтому вы можете написать App.get_running_app().root.ids.manager.current = 'some_screen'. Опять же, могут быть более точные способы сделать это в зависимости от того, как вы структурируете свой код, но это всегда вариант.

...