From 45ebde25a8c462596f8210715ce2b5150ed0559c Mon Sep 17 00:00:00 2001 From: Javier Sancho Date: Fri, 3 Aug 2018 12:35:22 +0200 Subject: [PATCH] New post "Designing forms with Python and Kivy" --- 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..692e5cb --- /dev/null +++ b/posts/20180802-kivyforms.html @@ -0,0 +1,95 @@ +title: Designing forms with Python and Kivy +date: 2018-08-03 13:43 +tags: form, python, kivy, kivyforms +--- +
+ form + +

There are many libraries to create graphical interfaces with Python. For example, I tried with wxPython, PyQt and Kivy. The latter is the one I liked the most for a number of reasons:

+ +
    +
  • It's multiplatform and works in GNU/Linux, Windows, OS X, Android, iOS and Raspberry Pi. I've only tried the first two, but I've been able to verify that it's designed for use with keyboard and mouse or with touch screens.
  • +
  • It's not based on the platforms native widgets but has its own, so the applications look the same on all platforms.
  • +
  • It's fast; the graphics engine works on OpenGL ES 2 and many parts are written with Cython.
  • +
  • You can design the interfaces directly with Python or using Kv language.
  • +
  • It's a relatively new project, and well maintained.
  • +
  • Good documentation and many examples.
  • +
+ +

I'm working on an apps development framework, so I need developers to be able to design forms quickly, WYSIWYG way, and they can also include their own themes, colors, etc. Thanks to Kv language, this task is easier for me. It's something similar to QML in Qt, and allows to save compositions in text files that can be loaded later by the application, without having to modify any code.

+ +

For example, the Kivy Hello World would be:

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

To design the forms, I created a widget that provides a canvas, in which it's possible to add buttons, labels, text fields and things like that. The project is called KivyForms and is currently beta. You can also watch a video with an example of using KivyForms. The idea is that the widget has a powerful API to be integrated into any application that needs forms composition.

+ +

Look what the widget contains:

+ +
+    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)
+  
+ +

FormCanvas is based on a Kivy BoxLayout, and has a StackLayout inside, where form widgets will be added. The StackLayout allows other widgets to stack without occupying the full size of the screen.

+ +
+    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)
+  
+ +

Each time we add a widget, a Grabbable item is instantiated for containing the widget we want to add. It's this Grabbable item that we really add to the canvas. This allows us to select the widget and move it around the form to design the composition.

+ +

There is a Destination item to indicate where the widget will be placed when the drag operation ends.

+ +
+    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
+            ]
+  
+ +

This item, which is a simple label with dotted border, is very useful for the developer to be able to place widgets in the right place.

+ +

Finally, it's possible to export the composition to Kv language. KivyForms is in charge of filtering all the Grabbable items and the configuration needed for the design of the form, so we can save the composition directly to a file, ready to be used in our programs.

+ +

KivyForms is distributed under MIT license. Although I prefer GPL licenses, in this case I have decided to use, for consistency, the same license as Kivy, so you are invited to collaborate on the project.

+
-- 2.39.2