tutorial learn language ids python layout widget kivy

python - learn - Plantilla Kivy con diseño de cuadrícula dinámico



kivy learn (2)

Estoy intentando crear una plantilla para un diseño que se parece a lo siguiente:

|----------| | | | IMAGE | <--- Just an image (square) | | |----------| |[btn][btn]| <--- GridLayout cols=2 of buttons |[btn][btn]| |[btn][btn]| |[btn][btn]| |[btn][btn]| |[btn][btn]| |----------|

la primera parte es fácil (pero podría estar equivocado, ya que soy muy nuevo en kivy)

#:kivy 1.6 [SideBar@BoxLayout]: orientation: ''vertical'' Image: source: ctx.image size_hint: (1, None) height: root.width GridLayout: cols: 2 # What do I do here to make it easy to load a list of buttons?


#!/usr/bin/env python2 from kivy.app import App from kivy.lang import Builder from kivy.uix.floatlayout import FloatLayout from kivy.uix.button import Button Builder.load_string('''''' #:kivy 1.6 [SideBar@BoxLayout]: content: content orientation: ''vertical'' size_hint: ctx.size_hint if hasattr(ctx, ''size_hint'') else (1, 1) Image: source: ctx.image size_hint: (1, None) height: root.width GridLayout: cols: 2 # just add a id that can be accessed later on id: content <Root>: Button: center_x: root.center_x text: ''press to add_widgets'' size_hint: .2, .2 on_press: # what comes after `:` is basically normal python code sb.content.clear_widgets() # however using a callback that you can control in python # gives you more control root.load_content(sb.content) SideBar: id: sb size_hint: .2, 1 image: ''data/images/image-loading.gif'' '''''') class Root(FloatLayout): def load_content(self, content): for but in range(20): content.add_widget(Button( text=str(but))) class MyApp(App): def build(self): return Root() if __name__ == ''__main__'': MyApp().run()

Espero que los comentarios en línea den el ejemplo lo suficientemente claro. En este caso, solo estamos pasando la referencia del contenido a la función que agrega widgets al contenido.

Hay situaciones en las que es posible que desee tener acceso al Widget como un atributo de su propia clase. En ese caso, puede usar el siguiente método .

El método anterior básicamente agrega una ObjectProperty del mismo nombre que el id, pasa la referencia del widget al que hace referencia el ID. Entonces, ahora tiene un atributo con el mismo nombre que el ID en su clase de Python para facilitar el acceso. Usando el método mencionado anteriormente, su código sería algo como esto.

#!/usr/bin/env python2 from kivy.app import App from kivy.lang import Builder from kivy.uix.floatlayout import FloatLayout from kivy.uix.button import Button from kivy.properties import ObjectProperty Builder.load_string('''''' #:kivy 1.6 [SideBar@BoxLayout]: content: content orientation: ''vertical'' size_hint: ctx.size_hint if hasattr(ctx, ''size_hint'') else (1, 1) Image: source: ctx.image size_hint: (1, None) height: root.width GridLayout: cols: 2 # just add a id that can be accessed later on id: content <Root>: content: sb.content Button: center_x: root.center_x text: ''press to add_widgets'' size_hint: .2, .2 on_press: sb.content.clear_widgets() root.load_content() SideBar: id: sb size_hint: .2, 1 image: ''data/images/image-loading.gif'' '''''') class Root(FloatLayout): content = ObjectProperty(None) ''''''This is initialised to None and in kv code at line 28 above (the one with `content: sb.content`) a ref to the actual content is passed'''''' def load_content(self): content = self.content for but in range(20): content.add_widget(Button( text=str(but))) class MyApp(App): def build(self): return Root() if __name__ == ''__main__'': MyApp().run()


Pruebe python-micro-template ( https://github.com/diyism/python-micro-template ), puede cargar el archivo de plantilla dinámica remota:

<:for i in range(30):#{#:> Button: text: ''<:=i:><:for j in range(6):#{#:><:=j:><:#}#:>'' size: 480, 40 size_hint: None, None <:#}#:>