Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kivy ScreenManager不切换屏幕(纯python)_Python_Kivy - Fatal编程技术网

Kivy ScreenManager不切换屏幕(纯python)

Kivy ScreenManager不切换屏幕(纯python),python,kivy,Python,Kivy,我对Kivy很陌生,我有一个自己无法解决的问题。 我有一个简单的应用程序,我想在图像之间切换(主屏幕) 代码如下: IMAGE_SIZE = (640, 480) class MainScreen(Screen): def __init__(self, path, **kwargs): super(MainScreen, self).__init__(**kwargs) Window.size = (IMAGE_SIZE[0], IMAGE_SIZE[

我对Kivy很陌生,我有一个自己无法解决的问题。 我有一个简单的应用程序,我想在图像之间切换(主屏幕)

代码如下:

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()

我进行了打印,以查看screen manager中是否有更改:

在我看来,经理确实改变了屏幕,但我还是看到了同样的画面

我已经看过这个问题了,我没有发现任何有用的东西

如果有人知道我做错了什么,我将感谢任何帮助/建议

更新:


@JohnAnderson在评论中注意到,我应该交换屏幕的名称,而不是屏幕本身,但是没有任何变化。

您必须操作的是
screen\u manager.current
而不是
screen\u manager.current\u 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')

您需要在
Screen\u manager.current=
中使用
屏幕的指定
名称。您指定的名称为“1”和“2”。因此,该行应该看起来像
screen\u manager.current=“1”
您不能直接更改“current\u screen”。@JohnAnderson是的,您是对的,但我刚刚将名称更正为“1”,没有任何更改。您不能直接更改“当前屏幕”-但我能做什么?实际上,我会使用kv语言来实现这个目的,但是我没有发现任何关于kv语言和键盘事件的信息。非常感谢!