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
<:#}#:>