python - ¿Cómo acceder a id/widget de clase diferente desde un archivo kivy(.kv)?
events button (1)
¡Bueno !, parece que yo mismo encontré la respuesta y me gustaría compartirla.
En primer lugar, demos "id" en el archivo date_test.kv. Para que pueda acceder a ellos en código python o en un archivo .kv.
<Get_People>:
stuff_p: root_lbl
...
Get_Boys:
id: gb
Get_Girls:
id: gg
<Get_Boys>:
stuff_b: label_b
<Get_Girls>:
stuff_c: label_g
te preguntarás qué es stuff_p, stuff_b y stuff_c ???
Son ObjectProperty definidos en sus propias clases. Los cambios que realice en stuff_b en su código de Python hacen cambios en label_b como lo ha vinculado en el archivo kivy.
class Get_People(BoxLayout):
stuff_p = ObjectProperty(None)
...
class Get_Boys(BoxLayout):
stuff_b = ObjectProperty(None)
...
class Get_Girls(BoxLayout):
stuff_c = ObjectProperty(None)
...
Para la Parte 1 y la Parte 2
Si se libera el botón con id: button_b (clase Get_Boys), entonces la etiqueta con id: label_g (clase Get_Girls) debe cambiar.
Si se presiona el botón con id: button_b (clase Get_Boys), entonces la etiqueta con id: root_lbl (clase Get_People) debe cambiar.
En la clase Get_Boys (test.py) defina estos métodos.
def change_girl(self):
self.parent.ids.gg.stuff_c.text = "Boys changed Girls!"
#self.stuff_b.text = "i changed myself!"
def change_people(self):
self.parent.ids.root_lbl.text = "Boys changed people!"
veamos que pasó aquí ...
self.parent.ids.gg.stuff_c.text = "¡Los niños cambiaron a las niñas!"
- self.parent se refiere a la clase Get_Parent.
- .ids.gg se refiere a la identificación que creamos anteriormente para Get_Girls.
- .stuff_c se usa para referir label_g (arriba) en la clase Get_Girls.
- .text se usa para cambiar el texto en la etiqueta.
y en el archivo .kv
<Get_Boys>:
stuff_b: label_b
Button:
id: button_b
text: "button 1"
on_release: root.change_girl()
on_press: root. change_people()
Para la parte 3
- Si se libera el botón con id: root_btn (clase Get_People), entonces la etiqueta con id: label_b (clase Get_Boys) debe cambiar.
en la clase Get_People (test.py) defina un método.
def rooted(self):
self.ids.gb.stuff_b.text = "people changed boys!"
y en archivo .kv
Button:
id: root_btn
text: "I am Root"
on_release: root.rooted()
¿Qué quiero saber?
- Si se libera el botón con id: button_b (clase Get_Boys), entonces la etiqueta con id: label_g (clase Get_Girls) debe cambiar.
- Si se presiona el botón con id: button_b (clase Get_Boys), entonces la etiqueta con id: root_lbl (clase Get_People) debe cambiar.
- Si se libera Button with id: root_btn (clase Get_People), entonces Label with id: label_b (clase Get_Boys) debe cambiar.
Se explica (poco) en this enlace, pero no desde el punto de vista del principiante.
Tengo 2 archivos
- prueba.py
- date_test.kv
prueba.py
class Get_People(BoxLayout):
pass
class Get_Boys(BoxLayout):
pass
class Get_Girls(BoxLayout):
pass
class TestApp(App):
def build(self):
self.load_kv(''dates_test.kv'')
return Get_People()
archivo date_test.kv
<Get_People>:
orientation: ''vertical''
Button:
name: root_btn
id: root_btn
text: "I am Root Button"
on_release: change_label_b
Label:
id: root_lbl
text: "I am Root Label"
Get_Boys:
Get_Girls:
<Get_Boys>:
Button:
id: button_b
text: "Button for boys"
on_press: change_label_root
on_release: change_label_g
Label:
id: label_b
text: "Label for boys"
<Get_Girls>:
Button:
id: button_g
text: "Button for girls"
Label:
id: label_g
text:"Label for girls"