簡體   English   中英

Kivy ScreenManager 不切換屏幕(純python)

[英]Kivy ScreenManager does not switch screens (pure python)

我對 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 在評論中注意到,我應該交換屏幕的名稱,而不是屏幕本身,但是沒有任何改變。

您必須操作的是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()

經過一番挖掘,我找到了另一個答案。 我還可以使用:

            screen_manager.switch_to(screen_1, direction='left')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM