[英]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.