Sintaxis
La estructura de un fichero kv será la siguiente
#:kivy 1.9.0
# Aquí el contenido
La primera linea indica al sistema la mínima versión de Kivy requerida para que se ejecute la app. Luego pondremos todo el contenido debajo.
kv language es un lenguaje de marcado muy parecido a QML, pero que ademas permite añadir reglas. Este lenguaje tiene una sintaxis muy sencilla que se compone basicamente de 4 "construcciones":
- Directivas: Se verán más adelante
- Reglas: Sirven para sobreescribir widgets.
- Un Widget root: Es el widget principal del cual nacen los demás widgets
- Clases dinámicas: Es una manera de crear widgets nuevos
Todo lo que vaya dentro de un widget, debe ir identado como en Python.
Reglas
Las reglas son como las reglas CSS, y sirven para modificar uno o varios widgets. Por ejemplo supongamos que alos widgets Buttonton y Label. Queremos que los dos tenga un texto común, y que el Button tenga un color distinto. La sintaxis sería la siguiente:
<Button, Label>:
text: 'Texto de los widgets'
<Button>:
background_color: 1, 1, 1, 1
Las reglas siempre van entre <>
Widget root
Siempre hay un widget (componente visual) raíz (root), al que se le añaden los demás elementos.
Aquí vemos un ejemplo de como sería un widget root, en este caso sería un BoxLayout que contiene dos botones. El BoxLayout tendrá una orientación vertical:
BoxLayout:
orientation: 'vertical'
spacing: 10
Button:
text: 'Boton 1'
Button:
text: 'Boton 2'
Podríamos hacer un widget root personalizado, en este caso lo llamamos Pantalla y el kv sería así
#:kivy 1.9.0
<Pantalla>:
orientation: 'vertical'
spacing: 10
Button:
text: 'Boton 1'
Button:
text: 'Boton 2'
Teniendo en nuestro script python el siguiente código
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class Pantalla(BoxLayout):
pass
class MainApp(App):
def buid(self):
return Pantalla()
MainApp().run()
Todos los widgets que sean de Kivy se les nombra tal cual, pero a los propios se les pone <>. Se recomienda siempre que el widget root sea propio, aunque en esencia sea otro, ya que luego hrabrá que editarlo desde Python queramos o no.
Clases dinámicas
Las clases dinámicas lo que hacen es extender a un tipo de widget ya existente (que no es más que una clase). Al igual que las reglas, iran definidos entre <>, pero dentro tendran @WidgetKivy dentro, donde extenderá a la subclase WidgetKivy. Además se pueden extender más de un widget a la vez.
En el siguiente ejemplo vamos a crear dos widgets nuevos, uno hereda de Button y el otro de ButtonBehavior y Label
<BotonSimple@Button>:
# propiedades aquí
<BotonComplejo@ButtonBehavior+Label>:
# propiedades aquí
En Python tendríamos
class BotonSimple(Button):
pass
class BotonComplejo(ButtonBehavior, Label):
pass
Si quisieramos usar alguna clase dinámica en Python tenemos que usar la clase Factory
from kivy.factory import Factory
boton_simple = Factory.BotonSimple()
boton_complejo = Factory.BotonComplejo()