Cambiando los widgets de kivy

Estoy usando la biblioteca de Kivy python.

Tengo dos widgets definidos.

Cuando el progtwig se ejecuta, ejecuto el primer widget.

Cuando se presiona ese botón de widgets, quiero que desaparezca y se reemplace con el segundo widget.

Aquí está el .kv para los dos widgets

#uitest.kv : canvas: Rectangle: pos: self.center_x, 0 size: 10, self.height BoxLayout: size: root.size padding: 40 Button: text: 'Hello' on_release: root.testCallback() : canvas: Rectangle: pos: self.center_x, 0 size: self.height, 10 

Mi archivo principal de Python ejecuta la aplicación y devuelve el primer widget

 #main.py from testform import TestForm from kivy.app import App class UITestApp(App): def build(self): return TestForm() # Main launching point if __name__ in ('__main__', '__android__'): UITestApp().run() 

Mi primer widget tiene una callback. Aquí es donde pertenece el código en cuestión

 from testform2 import TestForm2 from kivy.uix.widget import Widget class TestForm(Widget): def testCallback(self): TestForm2() # Code in question goes here. @TODO replace this widget with TestForm2 widget. 

La idea aquí es tener un administrador de interfaz de usuario. Este administrador no ejecuta la interfaz de usuario como un árbol, sino como una lista y una stack. La lista contiene instancias de todos mis Formularios de UI. La stack mantiene el recorrido de dichas formas, siempre que saltamos a una forma, la colocamos en la stack y la “renderizamos” o lo que sea.

EDITAR: elegí mi respuesta, pero en mis búsquedas también encontré el objeto Pantalla: http://kivy.org/docs/api-kivy.uix.screenmanager.html Personalmente, los comandos clear () y add () son más potente, pero la pantalla toma mucho de eso de tus manos si estás interesado. Los efectos de transición también.

Mi sugerencia es tener un widget de administrador de interfaz, entonces puede tener varios widgets para sus formularios de UI.

 import kivy from kivy.uix.label import Label from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout from kivy.app import App class InterfaceManager(BoxLayout): def __init__(self, **kwargs): super(InterfaceManager, self).__init__(**kwargs) self.first = Button(text="First") self.first.bind(on_press=self.show_second) self.second = Button(text="Second") self.second.bind(on_press=self.show_final) self.final = Label(text="Hello World") self.add_widget(self.first) def show_second(self, button): self.clear_widgets() self.add_widget(self.second) def show_final(self, button): self.clear_widgets() self.add_widget(self.final) class MyApp(App): def build(self): return InterfaceManager(orientation='vertical') if __name__ == '__main__': MyApp().run() 

No lo estructurarías así, por supuesto. Puede mantener todos sus formularios en un diccionario en el objeto Contenedor y tener una callback universal que proporciona otra forma por clave.

 class InterfaceManager(BoxLayout): def __init__(self, **kwargs): super(InterfaceManager, self).__init__(**kwargs) self.forms = {} def add_form(self, key, form): self.forms[key] = form def uniCallback(self, button): self.clear_widgets() # You could introduce a more elegant key # handling system here. self.add_widget(self.forms[button.text]) 

Una forma sencilla de cambiar los widgets es dejar que uno tenga la altura completa de su contenedor y que el segundo tenga una altura de cero. Cuando necesites cambiar solo cambia las alturas.