image image


image

Auf ein Neues: Creative Coding mit Pythons Schildkröte 🐢

Heute möchte ich endlich mein vor zwei Tagen angekündigtes Vorhaben in die Tat umsetzen und mich Pythons Turtle widmen. Denn ich halte die Schildkröte – weil sie immer nur als Hilfsmittel für Programmieranfänger und/oder Kinder gesehen wird – für ein weitgehend unterschätztes Werkzeug, das sowohl für kreatives Programmieren, für die Spieleprogrammierung und auch für Visualisierungen viel mehr eingesetzt werden könnte.

Ein großer Vorteil der Schildkröte ist, daß sie zum Standard-Umfang von Python gehört, zusätzliche Installationen sind daher nicht nötig, ein einfaches import-Statement genügt und schon steht einem ein – trotz aller Beschränkheit wegen des darunterliegenden Tkinter – ein ziemlich leistungsfähiges Graphikpaket zur Verfügung.

Im Regelfalle importiere ich die Turtle mit der Zeile:

import turtle as t

Damit vermeide ich eine Verschmutzung des Namensraumes, muß aber nicht vor jedem Turtle-Befehl Turtle. voranstellen, ein einfaches t. genügt.

Dann kommt etwas, was oft vernachlässigt wird. Per Default stellt das Modul bei der Initialisierung einer Schildkröte ein zugehöriges Bildschirmfenster zur Verfügung. Das mag für Anfänger ganz praktisch sein, man ist dabei aber der Konfigurationsmöglichkeiten beraubt und auf eine Detault-Konfiguration beschränkt. Daher bevorzuge ich die explizite Initialisierung des Turtle-Spielfeldes mit:

wn = t.Screen()
wn.bgcolor("#e6e2cc")
wn.setup(width = 640, height = 400)
wn.title("Alex, Berta, Chris und Doris 🐢")

So kann ich nicht nur die Größe der Turtle-Arena, sondern auch seine Hintergrundfarbe und auch einen Titel festlegen, wn steht dabei für »Window«, gängige Variablennamen für das Fenster sind auch s oder screen, das ist nur von den Vorlieben des Programmierers abhängig.

In meinem Beispielprogramm, das vier Schildkröten eine Art Mandala zeichnen läßt, habe ich diese einzeln erzeugt und dann einer Liste turtles[] zugewiesen:

turtles = []

alex = t.Turtle()
alex.hideturtle()
alex.pencolor("#325069")
alex.pensize(2)
turtles.append(alex)

berta = t.Turtle()
berta.hideturtle()
berta.pencolor("#a0332e")
berta.pensize(2)
berta.left(-90)
turtles.append(berta)

Die beiden weiteren Schildkröten, die auf die schönen Namen chris und doris hören, habe ich analog erzeugt. Durch die Listenoperation sind die eigentlichen Zeichenvorgänge sehr kompakt niederzuschreiben:

for i in range(180):
    for j in range(4):
        for turtle in turtles:
            turtle.left(90)
            turtle.forward(d)
    for turtle in turtles:
        turtle.left(theta)

Nach diesen je vier Schritten je Turtle wird die Länge d, die die Turtles geradeaus laufen, ein wenig verlängert: d *= 1.003 und – da ich das Zeichnen mit wn.tracer(0) zu Beginn des Sketches angehalten hatte – mit wn.update() alle Zeichnungen, die während der 180 Schritte nur in einem Buffer stattfanden, in das Fenster gezeichnet.

Normalerweise – um den Zeichenvorgang zu beschleuigen – zeichnet man nur einmal am Schluß des Programmes, aber so entstand eine nette Animation, die die Konstruktion dieser Mandala noch einmal visualisiert.

Für diejenigen unter Euch, die das nachprogrammieren wollen, hier auch noch den vollständigen Quellcode, den Ihr aber auch in meinem GitHub-Repositorium findet.

import turtle as t

wn = t.Screen()
wn.bgcolor("#e6e2cc")
wn.setup(width = 640, height = 400)
wn.title("Alex, Berta, Chris und Doris 🐢")
wn.tracer(0)

d = 75
theta = 25
turtles = []

alex = t.Turtle()
alex.hideturtle()
alex.pencolor("#325069")
alex.pensize(2)
turtles.append(alex)

berta = t.Turtle()
berta.hideturtle()
berta.pencolor("#a0332e")
berta.pensize(2)
berta.left(-90)
turtles.append(berta)

chris = t.Turtle()
chris.hideturtle()
chris.pencolor("#8c5030")
chris.pensize(2)
chris.left(60)
chris.hideturtle()
turtles.append(chris)

doris = t.Turtle()
doris.hideturtle()
doris.pencolor("#d79e28")
doris.pensize(2)
doris.left(-60)
turtles.append(doris)

for i in range(180):
    for j in range(4):
        for turtle in turtles:
            turtle.left(90)
            turtle.forward(d)
    for turtle in turtles:
        turtle.left(theta)
    d *= 1.003
    wn.update()  # Den gesamten Bildschirm neuzeichnen
    
print("Die Schildkröten sagen: »We did it, Babe!« 🐢")

wn.mainloop()

Als Reminiszens an meinen alten Atari ST habe ich die Fenstergröße auf 640x400 Pixel festgelegt (das war die Auflösung des legendären, monochronen Atari-Monitors SM124 – ein wenig Nostalgie muß schließlich erlaubt sein). Ihr könnt die Fenstergröße natürlich verändern und dann ein wenig mit der Schrittlänge d spielen. Interessante Veränderungen beim Ergebnis zeigen sich allerdings nur, wenn Ihr dem Winkel theta andere Werte zuweist. Habt Spaß!

Ich jedenfalls hatte ihn und werde sicher in den nächsten Tagen und Wochen noch ein paar weitere, seltsame Dinge mit Pythons Schildkröte anstellen. Eventuell greife ich dabei alternativ auch hin und wieder wieder auf TigerJython und seine Turtle zurück.


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image