Aus Linux-Magazin 09/2019

Mit Python-Skripten zeichnen und Animationen erstellen

© besjunior, 123RF

Dank der freien Software Shoebot genügen wenige Zeilen Python-Code, um halbautomatisch Zeichnungen, Diagramme, Illustrationen und Animationen zu erzeugen. Das gelingt sogar Programmier-Einsteigern ohne umfassende Python-Kenntnisse, die Ergebnisse lassen sich bequem exportieren.

Seine Entwickler bezeichnen Shoebot [1] etwas kryptisch als “Python Grafik-Roboter”. Dessen Funktionsweise erweist sich jedoch als äußerst simpel: Mit einfachen Python-Befehlen kritzelt der Programmierer Linien, Rechtecke, Kreise und andere geometrische Figuren auf eine virtuelle Leinwand. Das Ergebnis ist eine Vektorgrafik, die Shoebot nicht nur auf den Bildschirm malt, sondern alternativ auch als SVG-, PDF-, Postscript- oder PNG-Datei speichert. Die Erzeuger dürfen die Grafiken sogar animieren und mit Hilfe so genannter Live-Variablen nach ihrer Generierung in Echtzeit ändern.

Viele Gesichter

Standardmäßig startet Shoebot einen Editor, in dem der Entwickler direkt Shoebot-Befehle eintippt. Die daraus entstehende Grafik zeigt ihm Shoebot per Knopfdruck. Dank des prompten visuellen Feedback eignet sich der Editor vor allem, um schnell erste Ergebnisse zu erzielen, Experimente zu starten, Prototypen zu bauen oder als Lehr- und Lernhilfe. Im Mathematikunterricht visualisiert Shoebot zum Beispiel einfach und schnell Fraktale.

Wer neu in die Software-Entwicklung einsteigen möchte, lernt zudem auf spielerische Weise die Programmierung und den Umgang mit Python. Künstler erzeugen prozedurale oder zufallsgesteuerte Grafiken, während Designer Visualisierungen oder Designkonzepte generieren.

Alternativ arbeitet Shoebot als Kommandozeilen-Programm, das ein Skript mit Shoebot-Befehlen einliest und auswertet. Der Nutzer bettet das Tool so auch in Shellskripte ein, wo es dann zum Beispiel Daten in ein PDF-Diagramm gießt oder automatisiert Vektorgrafiken erzeugt.

Binden Python-Programmierer Shoebot als Python-Modul ein, entwerfen sie so schnell den Prototyp ihres GUI. Auch als Plugin für Software, die sich über Python-Skripte steuern lässt, eignet sich Shoebot – dazu gehört etwa Inkscape. Einen Wermutstropfen gibt es aber: Shoebot setzt noch zwingend Python 2.7 voraus, dessen Support bald ausläuft.

Shoebot orientiert sich eng am ähnlich arbeitenden Nodebox [2]. Die Dokumentation verweist sogar zum Teil auf die des Kollegen. Weitere Vorbilder waren Shoes [3] und Drawbot [4], von denen Shoebot seinen Namen ableitet. Der Quellcode [5] steht unter der GPLv3.

Baumarkt

Um Shoebot in Betrieb zu nehmen, installiert der Entwickler zunächst Python 2.7, Pythons Setuptools und »pkg-config«. Dazu kommen noch die Bibliotheken Gtkview in Version 3 sowie Cairo nebst ihren jeweiligen Entwicklerpaketen. Unter Ubuntu 19.04 holt der folgende Befehl alles Notwendige hinzu:

sudo apt install python python-setup-tools pkg-config libcairo2-dev libgtk-sourceview-3.0-dev

Dann lädt er das Quellcode-Archiv von der Shoebot-Website [1] herunter und entpackt es. Die folgenden Befehle im Shoebot-Verzeichnis lösen weitere notwendige Abhängigkeiten auf und installieren die Software global im System:

./install/install_dependencies.sh
sudo python setup.py install

Der erste Befehl funktioniert allerdings nur auf Systemen mit Red Hat, Fedora, Debian, Ubuntu, Linux Mint oder einer Suse-Variante. Bei anderen Distributionen installieren Anwender manuell die Pakete zu GCC und Gir RSVG, das Entwicklerpaket für Python 2.7 sowie die Python-Module Pycairo, Gobject, Cairo Gobject und Pillow. Hinzu kommen noch die Bibliotheken Gtk+3, Cairo und Libjpeg mit ihren Entwicklerpaketen.

Sofern der Aufruf von »setup.py« oder später der Start von Shoebot scheitert, fehlt sehr wahrscheinlich eines der von Shoebot benötigten Pakete. Den Schuldigen verraten die mitunter vielen Fehlermeldungen entweder ganz am Anfang oder ziemlich am Ende.

Alternativ zur globalen Installation setzen Python-Kundige mit Virtualenv auch eine lokale auf. Dazu ersetzen sie den zweiten Befehl von eben durch:

virtualenv .env
source .env/bin/activate
python setup.py install

Fortan aktivieren die Shoebot-Nutzer die Umgebung vor dem Einsatz von Shoebot jeweils per »source .env/bin/activate«.

Malen nach Zahlen

Nach dem Aufruf von »shoebot« startet der Editor aus Abbildung 1. »File | Open« lädt ein fertiges Shoebot-Skript, von denen im Unterverzeichnis »examples« gleich mehrere warten. Jedem Skript spendiert Shoebot ein eigenes Fenster. In ihm erscheint links der Quellcode, wobei der Editor auch Syntax Highlighting anbietet. Ein »Run | Run Script« startet das Skript dann. Alle Textausgaben landen auf der rechten Seite des Fensters, die Zeichnung erscheint in einem neuen separaten Fenster. Auch bei einem Tipp- oder sonstigen Fehler erscheint dort eine Meldung (Abbildung 2).

Abbildung 1: Hier zeigt der Editor das mitgelieferte Beispielskript »primitives.bot« aus dem Verzeichnis »examples/basic«. Es zeichnet in einem Fenster mehrere geometrische Grundformen.

Abbildung 1: Hier zeigt der Editor das mitgelieferte Beispielskript »primitives.bot« aus dem Verzeichnis »examples/basic«. Es zeichnet in einem Fenster mehrere geometrische Grundformen.

Ein Beispiel für ein einfaches Shoebot-Skript zeigt Listing 1. Jeder Befehl bekommt in den Klammern noch einige notwendige Parameter übergeben. Ein Rechteck erhält so beispielsweise seine Position und Größe mitgeteilt. Kommentare beginnen mit »#«.

Abbildung 2: Neben Fehlermeldungen erscheint im Ausgabefenster dieses gelbe Symbol.

Abbildung 2: Neben Fehlermeldungen erscheint im Ausgabefenster dieses gelbe Symbol.

Listing 1 setzt zunächst mit »size()« die Größe der Zeichenfläche auf 300 mal 300 Pixel, anschließend taucht sie den »background()« in ein zartes Hellrot. Die Intensität der Farbkomponenten Rot, Grün und Blau müssen Entwickler normalerweise in Fließkommazahlen zwischen »0« und »1.0« angeben. Der Aufruf »background(1.0, 0, 0)« würde beispielsweise den Hintergrund in knalligem Rot anstreichen. Viele Entwickler sind jedoch gewohnt, Werte zwischen 0 und 255 anzugeben. In Listing 1 schaltet deshalb »colorrange(255)« auf diese Notation um.

Schiebung

Anschließend zeichnet »rect()« ein Rechteck. Die ersten beiden Werte geben die Position der linken oberen Ecke an. Die Zeichenfläche nummeriert dabei standardmäßig alle Pixel von links oben nach rechts unten durch. Die Position »0,0« befindet sich folglich in der linken oberen Ecke der Zeichenfläche.

Listing 1

Beispiel für eine einfache Zeichnung

01 # Setze die Größe der Zeichenfläche
02 size(300,300)
03
04 # Male den Hintergrund in einem Hellrot (Skala 255 und nicht 1)
05 colorrange(255)
06 background(250,200,200)
07
08 # Zeichne ein Rechteck
09 rect(0,0,40,40, roundness=1.0)
10
11 # Verschiebe den Zeichenstift (das Koordinatensystem)
12 translate(100,100)
13
14 # Drehe die Zeichenfläche um 45 Grad (das Koordinatensystem)
15 rotate(45)
16
17 # Male einen Pfeil
18 arrow(0, 0, 50)
19
20 # Mache alle Transformationen rückgängig
21 reset()
22
23 # Schreibe Text
24 text("Hallo Welt", 50, 30)

Das Rechteck aus Listing 1 ist zudem 40 Pixel breit und 40 Pixel hoch. Der Wert hinter dem optionalen »roundness=« bestimmt zusätzlich, wie stark das Skript die Ecken abrundet. Das Maximum liegt bei »1.0«, das kreisförmige Ecken wie in Abbildung 3 erzeugt.

»translate()« verschiebt das Koordinatensystem der Zeichenfläche an die angegebene Position, »rotate()« dreht sie. In Listing 1 geht Shoebot folglich zunächst 100 Pixel nach rechts, dann 100 Pixel nach unten, dreht die Zeichenfläche um 45 Grad und malt an dieser Position mit »arrow()« einen Pfeil, der 50 Pixel breit ist. Dank der Drehung zeigt der Pfeil nicht nach rechts, sondern nach rechts oben. Das abschließende »reset()« nimmt alle Transformationen wieder zurück, die Position »0,0« befindet sich folglich wieder in der linken oberen Ecke. »text()« schreibt schließlich noch »Hallo Welt« an die angegebene Position.

Abbildung 3: <a href="#artRef-l1">Listing 1</a> erzeugt dieses Ergebnis. Die Ecken des Rechtecks sind maximal gerundet.

Abbildung 3: Listing 1 erzeugt dieses Ergebnis. Die Ecken des Rechtecks sind maximal gerundet.

Alle Shoebot-Skripte sind immer auch Python-Programme. Entwickler dürfen folglich den kompletten Sprachumfang von Python 2.7 nutzen und beispielsweise in einer Schleife mehrere Kreise auf den Bildschirm zeichnen. Auf diese Weise lassen sich auf die Schnelle verschiedene Muster erzeugen.

Bibliothekar

Neben den Anweisungen aus Listing 1 kennt Shoebot von Haus aus nur noch ein paar weitere primitive Zeichenbefehle [6], die im Wesentlichen geometrische Figuren auf den Schirm pinseln. Mit ergänzenden Bibliotheken [7] erleichtert Shoebot dem Nutzer die Arbeit. Diese haben Shoebot-Entwickler teilweise einfach von Nodebox übernommen, teilweise aber auch selbst geschrieben. So manipulieren die Befehle aus der »photobot«-Bibliothek Fotos, während »sbaudio« Audiodateien visualisiert. Graphen zeichnen Entwickler mit »graph«.

Listing 2

Beispiel für einen Graphen

01 graph = ximport("graph")
02 karte = graph.create(distance=0.6)
03 karte.add_node("Düsseldorf")
04 karte.add_node("Köln")
05 karte.add_node("Bonn")
06 karte.add_edge("Düsseldorf", "Köln")
07 karte.add_edge("Köln", "Bonn")
08 karte.solve()
09 karte.draw()

Listing 2 zeigt ein einfaches Beispiel, das einen Graphen mit drei Knoten und zwei Kanten erzeugt (Abbildung 4), die dann »g.solve()« auf der Zeichenfläche automatisch passend anordnet und »g.draw()« schließlich zeichnet.

Abbildung 4: Ausschnitt des ins SVG-Format exportierten Graphen mit den drei St&auml;dten.

Abbildung 4: Ausschnitt des ins SVG-Format exportierten Graphen mit den drei Städten.

Das Beispiel demonstriert auch, dass Entwickler spätestens an dieser Stelle Python-Kenntnisse benötigen. So gibt etwa »graph.create()« ein so genanntes Objekt zurück, mit dem der Programmierer dann weiterarbeiten muss.

Mehr Bewegung

Shoebot zeichnet nicht nur Grafiken, sondern erzeugt auch Animationen und verarbeitet Maus- und Tastatureingaben. Für beides benötigen Entwickler ebenfalls Python-Grundkenntnisse. Listing 3 zeigt ein Beispiel für eine simple Animation, die langsam eine Linie von links oben nach rechts unten zeichnet. »speed()« legt fest, mit wie vielen Bildern pro Sekunde die Animation abläuft. Die neu definierte Funktion »setup()« ruft Shoebot automatisch auf, bevor es die Animation startet. Wann immer Shoebot die Darstellung neu zeichnen muss, ruft es »draw()« auf. In Listing 3 zeichnet »draw()« eine Linie, die einen Punkt lang ist.

Listing 3

Beispiel für eine Animation

01 size(400,400)
02 speed(25)
03 stroke(0.2)
04 strokewidth(1)
05
06 def setup():
07     global x,y
08     x=0
09     y=0
10
11 def draw():
12     global x,y
13     x = x + 1
14     y = y + 1
15     line(x,y, 1,1)

Den aktuellen Status der Maus und der Tastatur enthalten spezielle Variablen. So stecken in »MOUSEX« und »MOUSEY« die aktuelle x- und y-Position des Mauszeigers. »mousedown« ist »True«, so lange der Nutzer den Mausknopf anklickt, »key« enthält die gerade aktuell gedrückte Taste. Die Funktion »text(key, 50, 30)« würde somit den Buchstaben der zuletzt gedrückten Taste anzeigen.

Live is Live

Wie im Beispiel aus Listing 3 benötigen Shoebot-Anwender hin und wieder Variablen, deren Inhalte sie dann an die Zeichenfunktionen verfüttern. Shoebot kennt so genannte Live-Variablen, die Entwickler ändern dürfen, während sie das Shoebot-Skript ausführen. Als Hilfe erweisen sich diese Variablen vor allem in Animationen. Eine Live-Variable definieren Programmierer nach folgendem Muster:

var('position', NUMBER, 15., 0., 30.)

In diesem Beispiel entsteht die neue Live-Variable »position«, die Zahlen (»NUMBER«) speichert. Standardmäßig enthält die Variable »position« den Wert 15. Prinzipiell sind jedoch Zahlen zwischen 0 und 30 erlaubt. Aktiviert der Anwender im Shoebot-Editor die Option »Run | Show Variable«, erscheint ein weiteres Fenster mit einem Regler, über den er den Wert von »position« in Echtzeit verändert (Abbildung 5).

Abbildung 5: Die Variable &raquo;position&laquo; nimmt abh&auml;ngig von den Einstellungen den entsprechenden Wert an. Auf diese Weise legt der Entwickler etwa die korrekte Position eines Rechtecks interaktiv fest.

Abbildung 5: Die Variable »position« nimmt abhängig von den Einstellungen den entsprechenden Wert an. Auf diese Weise legt der Entwickler etwa die korrekte Position eines Rechtecks interaktiv fest.

Auf Kommando

Auch wenn es sich bei den Shoebot-Skripten um Python-Programme handelt, landen sie in Dateien mit der Endung ».bot«. Ein solches Skript verarbeitet die Kommandozeilen-Version von Shoebot. Dazu muss es der Entwickler lediglich an das Tool »sbot« verfüttern:

sbot primitives.bot

Shoebot zeichnet das Ergebnis in ein neues Fenster. Der optionale Parameter »-f« schaltet den Vollbildmodus ein, den im Editor der Menüpunkt »Run | Full screen« aktiviert. Alternativ leitet »sbot« die Ausgabe auch in eine Datei um:

sbot primitives.bot -o primitives.png

In diesem Fall entsteht eine PNG-Datei. Das gewünschte Dateiformat erkennt »sbot« praktischerweise anhand der Datei-Endung. Erlaubt sind derzeit ».png«, ».svg«, ».pdf« und ».ps«.

Integrationshelfer

Den Wert von Live-Variablen übergibt der Entwickler in Json-Notation, etwa via:

sbot --vars='{ "position": 21 }' Meinskript.bot

Entwickler können jedoch nicht nur in Shoebot-Skripten Python-Code verwenden, sondern umgekehrt auch Shoebot als Python-Modul einbinden. Das gelingt mit zwei Zeilen, wobei die Ausgaben in der Datei »test.png« landen:

import shoebot
bot = shoebot.create_bot(outputfile="test.png")

Das Objekt »bot« bietet jetzt als Methoden die bekannten Shoebot-Befehle an. So würde beispielsweise »bot.rect(10,10,40,40)« ein Rechteck auf die Zeichenfläche pinseln. Zum Schluss schreibt »bot.finish()« die Ergebnisse in die angegebene Datei.

Fazit

Shoebot bietet einen sehr interessanten Ansatz: Mit nur wenigen Zeilen Python-Code erzeugen Entwickler schnell Zeichnungen und sogar Animationen. Der Befehlssatz beschränkt sich allerdings im Wesentlichen auf ein paar einfache geometrische Formen. Das ändern auch die zusätzlichen Bibliotheken nur in homöopathischen Dosen. Ein direkter Konkurrent ist daher das Turtle-Modul aus der Standardbibliothek.

Die Links in der noch etwas kargen Shoebot-Dokumentation führen an einigen Stellen ins Leere. Nicht zuletzt setzt das Tool noch auf das alte Python 2.7.

Mit Shoebot gelangen allerdings auch Python-Einsteiger schnell zu Ergebnissen, das gilt insbesondere für den einfach aufgebauten Editor. Zudem lassen sich schnell Animationen erzeugen, die Entwickler dank der Live-Variablen auch noch komfortabel verändern. Wer unkompliziert Grafiken programmieren möchte, sollte daher durchaus mehr als einen Blick auf Shoebot werfen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben