.. _Kivy:
``Kivy`` - ein Toolkit für GUI-Programme
========================================
`Kivy `__ ist eines von mehreren Toolkits, mit denen sich in
Python Programme mit einer graphischen Bedienoberfläche (Graphical User
Interface, kurz: GUI) programmieren lassen. [#]_ Um Kivy mit Python3 nutzen zu
können, müssen die folgenden Pakete installiert werden:
.. code-block:: sh
# Aktuelle Paketquellen hinzufügen:
sudo add-apt-repository ppa:kivy-team/kivy
# Paketquellen auf mögliche Updates prüfen:
sudo aptitude update
# Kivy-Pakete installieren:
sudo aptitude install cython3 python3-kivy python3-kivy-bin python3-kivy-common
# Kivy-Beispiele installieren (optional):
sudo aptitude install kivy-examples
Installiert man auch das Paket ``kivy-examples``, so können im Verzeichnis
``/usr/share/kivy-examples`` einige fertige Beispiel-Programme ausprobiert und
als Vorlage genutzt werden.
.. _Hallo-Welt-Beispiel Kivy:
Ein "Hallo Welt"-Beispiel
-------------------------
Mit Kivy geschriebene Programme haben stets eine ``App``-Klasse, die am
einfachsten mittels :ref:`Vererbung ` auf der Standard-App-Klasse
aufbauen kann. Diese Standard-Klasse stellt unter anderem eine ``run()``- und
eine ``build()``-Methode bereit, wobei letztere automatisch aufgerufen wird,
wenn das Programm mittels der ``run()``-Methode gestartet wird. Die
``build()``-Funktion wiederum startet automatisch das graphische Bedienfenster,
und kann zugleich weitere Elemente in diesem Fenster platzieren; sie sollte
als Ergebnis stets das "Root"-Widget der Anwendung liefern.
Im einfachsten Fall soll ein schlichter "Button" mittig im Fenster platziert
werden, der die Bezeichnung "Hallo Welt!" trägt. Ein erstes vollständiges
Programm, das wiederum auf ein bereits vordefiniertes Button-Element
zurückgreift, kann damit folgendermaßen aussehen:
.. Creating a kivy application is as simple as:
.. * sub-classing the App class
.. * implementing its build() method so it returns a Widget instance (the root of
.. your widget tree)
.. * instantiating this class, and calling its run() method.
.. code-block:: python
# Datei: hello.py
import kivy
kivy.require('1.9.0') # Mindest-Version von Kivy
from kivy.app import App
from kivy.uix.button import Button
class HelloApp(App):
def build(self):
return Button(text='Hallo Welt!')
if __name__== "__main__":
HelloApp().run()
Das ``uix``-Modul stellt allgemeine GUI-Elemte bereit, wie beispielsweise
Widgets und Layouts.
Bei einem Aufruf der Programmdatei wird durch die :ref:`if-main-Abfrage
` eine Instanz der App erzeugt und diese gestartet, wobei wiederum die
``build()``-Funktion aufgerufen wird:
.. code-block:: sh
python3 hello.py
Damit erscheint folgendes "Anwendungs"-Fenster:
.. image:: kivy-hallo-welt.png
:align: center
:width: 40%
Dieses erste Programm hat keine weitere Funktion; es kann beendet werden, indem
auf das ``X``-Symbol geklickt wird oder in der Shell die Anwendung mittels
``Ctrl c`` unterbrochen wird.
.. _kv-Dateien:
.. _Design-Anpassungen mittels einer ``.kv``-Datei:
.. rubric:: Design-Anpassungen mittels einer ``.kv``-Datei
Das Layout einer Anwendung sollte für eine bessere Übersichtlichkeit,
Anpassungsfähigkeit und Wiederverwertbarkeit von der eigentlichen "Logik" des
Programms getrennt sein ("Model-View-Controller"). Mit Kivy wird dieser
Grundsatz in einer Art und Weise verfolgt, der stark an die Anpassung des
Layouts einer Webseite mittels CSS erinnert: Das Aussehen der einzelnen
graphischen Elemente eines Programms wird über eine entsprechende ``.kv``-Datei
festgelegt werden.
Beim Aufruf der Programm-Datei wird automatisch diejenige ``.kv``-Datei im
gleichen Verzeichnis geladen, deren Namen mit (in Kleinbuchstaben) dem Namen der
App-Klasse übereinstimmt: Hat die App-Klasse beispielsweise den Namen
``HelloWorldApp``, so heißt die zugehörige ``.kv``-Datei ``helloworld.kv``. In
dieser Datei kann mit einer `YAML `_-artigen
Syntax das Design einzelner "Widgets" (Teilbereiche des Hauptfensters) sowie
deren Anordnung festgelegt werden.
... to be continued ...
.. An zwei Stellen sind Python-Ausdrücke innerhalb einer ``.kv``-Datei möglich:
.. Bei einer Zuweisung eines Wertes an eine Property, oder bei der
.. Aktualisierung einer Property via ``on_property``, beispielsweise der
.. ``on_state`` bei einem Push-Button.
.. Wird der Python-Ausdruck in der gleichen Zeile angegeben, so darf er keinen
.. Zeilenumbruch beinhalten und muss stets einen Wert als Ergebnis liefern.
.. Als Alternative dazu kann er mit *genau* einer Einrückungstiefe über mehrere
.. Zeilen angegeben werden (weitere Einrückungstiefen sind nicht erlaubt).
.. Über so genannte "Adapter" können die Widgets wiederum Informationen mit dem
.. Hauptprogramm austauschen.
.. _Links:
.. rubric:: Links
* `Kivy Documentation (pdf, en.) `__
* `API Referenz (en.) `__
* `Kivy Language (en.) `__
* `Kivy Beispiele (en.) `__
.. raw:: html
.. only:: html
.. rubric:: Anmerkungen:
.. [#] Weiter GUI-Toolkits für Python sind das in der Standard-Installation
enthaltene `Tkinter `__,
sowie PyGTK, PyQT und wxPython (siehe `Übersicht
`__). Kivy ist allerdings
das einzige in Python selbst geschriebene Toolkit und bietet somit eine sehr
python-typische Syntax.