From fbb2c50261e5173255d2395ec4e19d9c55876bd9 Mon Sep 17 00:00:00 2001 From: Javier Sancho Date: Thu, 2 Aug 2018 18:19:25 +0200 Subject: [PATCH] =?utf8?q?New=20post=20"Dise=C3=B1ando=20formularios=20con?= =?utf8?q?=20Python=20y=20Kivy"?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- images/form.jpg | Bin 0 -> 55233 bytes posts/20180802-kivyforms.html | 95 ++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 images/form.jpg create mode 100644 posts/20180802-kivyforms.html diff --git a/images/form.jpg b/images/form.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f77f6ec0b6bdef380f608becc9ca32cec6091706 GIT binary patch literal 55233 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 H{`~&{Y6OD& literal 0 HcmV?d00001 diff --git a/posts/20180802-kivyforms.html b/posts/20180802-kivyforms.html new file mode 100644 index 0000000..62a9aa6 --- /dev/null +++ b/posts/20180802-kivyforms.html @@ -0,0 +1,95 @@ +title: Diseñando formularios con Python y Kivy +date: 2018-08-02 13:40 +tags: formulario, python, kivy, kivyforms +--- +
+ form + +

Existen muchas librerías para crear interfaces gráficas con Python. Por poner algún ejemplo, he probado con wxPython, PyQt y Kivy. Esta última es la que más me ha gustado por una serie de razones:

+ +
    +
  • Es multiplataforma y funciona en GNU/Linux, Windows, OS X, Anfroid, iOS y Raspberry Pi. Solo he probado las dos primeras pero sí que he podido comprobar que está pensada para usar con teclado y ratón o con pantallas táctiles.
  • +
  • No se basa en los widgets nativos de las plataformas sino que tiene los suyos propios, por lo que las aplicaciones se ven igual en todas las plataformas.
  • +
  • Es rápida; el motor gráfico funciona sobre OpenGL ES 2 y muchas partes están escritas en Cython.
  • +
  • Puedes diseñar las interfaces directamente desde Python o usando el lenguaje Kv.
  • +
  • Es un proyecto relativamente nuevo y con un buen mantenimiento.
  • +
  • Buena documentación y con muchos ejemplos.
  • +
+ +

Estoy trabajando en un framework de desarrollo de aplicaciones, por lo que necesito que los desarrolladores puedan diseñar formularios rápidamente, al estilo WYSIWYG, y que además puedan incluir sus propios temas, colores, etc. El hecho de que exista el lenguaje Kv me facilita mucho la tarea. Es algo parecido al QML que tiene Qt y que permite guardar tus composiciones en ficheros de texto que pueden ser cargados despues por la aplicación sin tener que tocar nada de código.

+ +

Por ejemplo, el Hello World de Kivy se podría escribir así:

+ +
+    # main.py file
+    from kivy.app import App
+
+    class TestApp(App):
+        pass
+
+    TestApp().run()
+
+    # test.kv file
+    Button:
+        text: 'Hello World'
+  
+ +

Para diseñar los formularios he creado un widget que proporciona un canvas en el que es posible añadir botones, etiquetas, campos de texto y cosas por el estilo. El proyecto se llama KivyForms y de momento es beta. También podeis ver un vídeo con ejemplo de uso de KivyForms. La idea es que el widget tenga una API potente para poder ser integrado en cualquier aplicación que necesite composición de formularios.

+ +

Mirad lo que contiene el widget:

+ +
+    class FormCanvas(BoxLayout):
+        def __init__(self, *args, **kwargs):
+            super(FormCanvas, self).__init__(*args, **kwargs)
+
+            self._canvas = StackLayout(
+                orientation='lr-tb',
+                padding=[10, 10, 10, 10],
+                spacing=[10, 10]
+            )
+            super(FormCanvas, self).add_widget(self._canvas)
+  
+ +

El FormCanvas se basa en un BoxLayout de Kivy e internamente tiene un StackLayout que es donde realmente se añadirán los widgets del formulario. El StackLayout permite que los demás widgets se vayan apilando sin ocupar todo el tamaño de la pantalla.

+ +
+    def add_widget(self, widget):
+        g = Grabbable(
+            height=self.widgets_height,
+            size_hint=self.widgets_size_hint
+        )
+        g.add_widget(widget)
+        self._canvas.add_widget(g)
+  
+ +

Cada vez que añadimos un widget se instancia un elemento Grabbable que contendrá al widget que queremos añadir. Es este elemento Grabbable el que realmente añadimos al canvas. Esto nos permitirá seleccionar el widget y moverlo por el formulario para diseñar la composición.

+ +

Existe un elemento Destination que sirve para indicar dónde caera el widget al finalizar la operación de arrastrar.

+ +
+    class Destination(Label):
+        def __init__(self, **kwargs):
+            super(Destination, self).__init__(**kwargs)
+            self.text = 'Widget goes here'
+            self.color = [1, 1, 0, 1]
+            with self.canvas.after:
+                Color(1, 1, 0, 1)
+                self.box = Line(dash_length=8, dash_offset=4)
+
+        def update_box(self):
+            self.box.points = [
+                self.x, self.y,
+                self.x, self.y + self.height,
+                self.x + self.width, self.y + self.height,
+                self.x + self.width, self.y,
+                self.x, self.y
+            ]
+  
+ +

Este elemento, que es una simple etiqueta con el borde punteado, es muy útil para que el desarrollador pueda ubicar los widgets en el lugar adecuado.

+ +

Por último, es posible exportar la composición a lenguaje Kv. KivyForms se encarga de eliminar los elementos Grabbable y todo el resto de la configuración necesaria para el diseño del formulario, de forma que es posible guardar la composición directamente a un fichero, lista para ser usada en nuestros programas.

+ +

KivyForms se distribuye bajo licencia MIT. Aunque prefiero las licencias GPL, en este caso he decidido usar, por coherencia, la misma licencia que Kivy, así que estais invitados a colaborar en el proyecto.

+
-- 2.39.2