Kivy ScreenManager не переключает экраны (чистый питон) - PullRequest
0 голосов
/ 07 ноября 2019

Я довольно новичок в Kivy, и у меня есть проблема, которую я не могу решить самостоятельно. У меня есть простое приложение, в котором я хочу переключаться между изображениями (MainScreen).

Это код:

IMAGE_SIZE = (640, 480)

class MainScreen(Screen):

    def __init__(self, path, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        Window.size = (IMAGE_SIZE[0], IMAGE_SIZE[1])


        with self.canvas:
            self.bg = Image(path)
            self.bind(pos=self.update_bg)
            self.bind(size=self.update_bg)

        self._keyboard = Window.request_keyboard(
            self._keyboard_closed, self, 'text')

        self._keyboard.bind(on_key_down=self._on_keyboard_down)

    def update_bg(self, *args):
        self.bg.pos = self.pos
        self.bg.size = self.size

    def _keyboard_closed(self):
        print('My keyboard have been closed!')
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
            keyboard.release()
        if keycode[1] == 'enter':


            print('before enter', screen_manager.current_screen)
            screen_manager.transition.direction = 'left'
            screen_manager.current_screen = scree_1
            print('after enter',screen_manager.current_screen)


        return True


screen_manager = None

scree_1 = MainScreen(path_1, name="1")
scree_2 = MainScreen(path_2, name="2")


class MyApp(App):

    def build(self):
        global screen_manager
        screen_manager = ScreenManager()

        screen_manager.add_widget(scree_2)
        screen_manager.add_widget(scree_1)

        return screen_manager


if __name__ == '__main__':
    MyApp().run()

Я сделал печать, чтобы увидеть, если что-то меняется в диспетчере экрана:

результат печати

Мне кажется, что менеджер действительно меняет экран, но у меня все та же картина.

Я ужепосмотрел на этот вопрос, и я не нашел ничего полезного.

Если у кого-то есть представление о том, что я делаю неправильно, я был бы признателен за любую помощь / совет.

Обновление:

@JohnAnderson заметил в комментариях, я должен был поменять имя экрана, а не сам экран, однако эфир ничего не меняет.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вы должны манипулировать screen_manager.current, а не screen_manager.current_screen.
Вы также должны ссылаться на screen по его имени.

Вот ваш код, работающий:

IMAGE_SIZE = (640, 480)


class MainScreen(Screen):

    def __init__(self, path, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        Window.size = (IMAGE_SIZE[0], IMAGE_SIZE[1])

        with self.canvas:
            self.bg = Image(source=path)
            self.bind(pos=self.update_bg)
            self.bind(size=self.update_bg)

        self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text')

        self._keyboard.bind(on_key_down=self._on_keyboard_down)

    def update_bg(self, *args):
        self.bg.pos = self.pos
        self.bg.size = self.size

    def _keyboard_closed(self):
        print('My keyboard have been closed!')
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
            keyboard.release()
        if keycode[1] == 'enter':
            print('before enter', screen_manager.current)
            screen_manager.transition.direction = 'left'
            screen_manager.current = "1"
            print('after enter', screen_manager.current)

        return True


screen_manager = None

scree_1 = MainScreen(path_1, name="1")
scree_2 = MainScreen(path_2, name="2")


class MyApp(App):

    def build(self):
        global screen_manager
        screen_manager = ScreenManager()

        screen_manager.add_widget(scree_2)
        screen_manager.add_widget(scree_1)

        return screen_manager


if __name__ == '__main__':
    MyApp().run()
0 голосов
/ 07 ноября 2019

После некоторых копаний я нашел другой ответ. Я также могу использовать:

            screen_manager.switch_to(screen_1, direction='left')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...