¿Cómo puedo hacer muchos botones dynamics en kv language?

Quiero hacer muchos Botones en lenguaje kv dynamic. Pero ahora no puedo … Mostraré ahora la fuente debajo de esto.


BoxLayout: orientation: 'vertical' pos: root.pos size: root.size GridLayout: rows: 2 spacing: 5 padding: 5 Button: text: "X0" on_press: root.X(0) Button: text: "X1" on_press: root.X(1) 

Quiero hacer como bajo código

 BoxLayout: orientation: 'vertical' pos: root.pos size: root.size GridLayout: rows: 2 spacing:5 padding:5 for i Button: text: "X#{i}" on_press: root.X(i) 

¿Como lo puedo hacer?

Tales bucles no son posibles en lenguaje kv, aparte de hacer algunos hacks sucios.

Para crear un conjunto de botones dinámicamente, use ListView o agréguelos en un bucle dentro de un archivo py.

Ejemplo:

 from functools import partial class MyGrid(GridLayout): def __init__(self, **kwargs): super(MyGrid, self).__init__(**kwargs) self.add_buttons() def add_buttons(self): for i in xrange(5): button = Button( text='X' + str(i), on_press=partial(self.X, number=i) ) self.add_widget(button) def X(self, caller, number): print caller, number 

Esto es falso, puede integrar fácilmente un bucle en su archivo KV, como este:

  GridLayout: pos: root.pos size: root.size cols:30 rows:3 on_parent: for i in range(10): strId = "B{0}".format(i+1); i=Button(text=strId, id=strId, on_press=lambda BingoMain:root.my_Function(strId)); self.add_widget(i); 

No creo que esto pueda hacerse en un archivo kv . Sin embargo, si puedes escribir la cadena kv en tu archivo python, puedes hacer algo como esto:

 from kivy.app import App from kivy.lang import Builder kv_string = """ BoxLayout: orientation: 'vertical' pos: root.pos size: root.size GridLayout: rows: 2 spacing: 5 padding: 5 """ + ''.join([""" Button: text: "X{0}" on_press: root.X({0}) """.format(i) for i in range(6)]) class MyApp(App): def build(self): w = Builder.load_string(kv_string) return w if __name__ == '__main__': MyApp().run()