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