Kivy: cambio de pantalla desde el código de Python

Estoy armando una aplicación Kivy y tengo algunos problemas para resolver cómo cambiar las pantallas en un punto elegido arbitrariamente dentro del código de Python.

En el siguiente ejemplo, me gustaría saber cómo cambiar de Screen2 a Screen1 ejecutando una función en mi archivo main.py

Aquí está mi main.py :

 # -*- coding: utf-8 -*- from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition from kivy.properties import ObjectProperty from functools import partial import random import time class ScreenOne(Screen): pass class ScreenTwo(Screen): def __init__(self,**kwargs): super(ScreenTwo, self).__init__(**kwargs) self.displayScreenThenLeave() def displayScreenThenLeave(self): # 'time.sleep(3)' is a stand-in for "execute some code here" time.sleep(3) self.changeScreen() # I want this function to send the user back to ScreenOne. def changeScreen(self): pass class Manager(ScreenManager): screen_one = ObjectProperty(None) screen_two = ObjectProperty(None) class ScreensApp(App): def build(self): m = Manager(transition=NoTransition()) return m if __name__ == "__main__": ScreensApp().run() 

Y aquí está mi screens.kv :

 #:kivy 1.8.0 : BoxLayout: orientation: "vertical" size: root.size spacing: 20 padding: 20 Label: text: "Main Menu" Button: text: "Button 1" on_release: root.manager.current = "screen2" : BoxLayout: orientation: "vertical" size: root.size spacing: 20 padding: 20 Label: id: label text: "Welcome to Screen 2, please wait three seconds" : id: screen_manager screen_one: screen_one screen_two: screen_two ScreenOne: id: screen_one name: "screen1" manager: screen_manager ScreenTwo: id: screen_two name: "screen2" manager: screen_manager 

Como debería ser bastante evidente, soy un principiante total en Kivy, así que realmente agradecería que me mostraras exactamente lo que necesito cambiar, incluida la syntax específica que se debe usar.

Gracias de antemano por su tiempo y sabiduría.

Aquí hay un ejemplo simple de ‘juego’ basado en su información adicional. Cuando un jugador entra en la pantalla del juego, sus puntos de salud están sangrando. Cuando el grupo llega a cero, se devuelven a la pantalla del menú.

main.py:

 #!/usr/bin/env python # -*- coding: utf-8 -*- from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition from kivy.properties import ObjectProperty, NumericProperty import time import threading class ScreenOne(Screen): pass class ScreenTwo(Screen): health_points = NumericProperty(100) def __init__(self, **kwargs): super(ScreenTwo, self).__init__(**kwargs) def on_health_points(self, instance, value): if value < 1: self.changeScreen() def on_enter(self, *args): thread = threading.Thread(target=self.bleed) thread.daemon = True thread.start() def bleed(self, *args): while self.health_points > 0: self.health_points -= 5 time.sleep(0.1) def displayScreenThenLeave(self): self.changeScreen() def changeScreen(self): if self.manager.current == 'screen1': self.manager.current = 'screen2' else: self.manager.current = 'screen1' class Manager(ScreenManager): screen_one = ObjectProperty(None) screen_two = ObjectProperty(None) class ScreensApp(App): def build(self): m = Manager(transition=NoTransition()) return m if __name__ == "__main__": ScreensApp().run() 

screens.kv:

 #:kivy 1.8.0 : BoxLayout: orientation: "vertical" size: root.size spacing: 20 padding: 20 Label: text: "Main Menu" Button: text: "Button 1" on_release: root.manager.current = "screen2" # reset health_points root.manager.ids.screen_two.health_points = 100 : BoxLayout: orientation: "vertical" size: root.size spacing: 20 padding: 20 Label: id: label text: "health points: " + str(root.health_points) : id: screen_manager screen_one: screen_one screen_two: screen_two ScreenOne: id: screen_one name: "screen1" manager: screen_manager ScreenTwo: id: screen_two name: "screen2" manager: screen_manager 

Haz estos pequeños cambios.

 #import Clock to create a schedule from kivy.clock import Clock class ScreenTwo(Screen): def __init__(self,**kwargs): super(ScreenTwo, self).__init__(**kwargs) #this is event that is fired when the screen is displayed. def on_enter(self, *args): self.displayScreenThenLeave() def displayScreenThenLeave(self): #schedued after 3 seconds Clock.schedule_once(self.changeScreen, 3) def changeScreen(self, *args): #now switch to the screen 1 self.parent.current = "screen1" 

Para obtener más información, vaya a estos enlaces Administrador de pantalla , Reloj