Lerne Coding
Python mit Schildkröte und Turtle Modul, Abläufe programmieren!
14.05.2023

Python mit Schildkröte und Turtle Modul, Abläufe programmieren!

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

Mit den Schildkröten bzw. dem Turtle Modul von Python, kann man zu beginnen, erste Schritte im Thema Programmieren machen. Häufig wird zu Anfang gerade auch für Kinder mit Scratch und Swift Playgrounds sehr grafische Interfaces empfohlen um mal nach Links, Rechts, Oben und Unten zu gehen. Genau dafür ist Turtle mit einer einfachen grafischen Oberfläche da, weshalb es sich gerade für Anfänger anbietet. Der große Vorteil gegenüber Anwendungen wie Scratch und Swift Playgrounds ist, dass direkt in einer Umgebung programmiert werden kann, wie es später auch wäre, das kann den Einstieg erleichtern.

Eine Grafische Audioanzeige erstellt mit Turtle
Eine Grafische Audioanzeige erstellt mit Turtle

Durch das Zeichnen von Abläufen könne verschiedenste Figuren erstellt werden, als Beispiele habe ich einmal einen Ablauf erstellt, der an eine Audioaufzeichnung erinnern soll.

ChatGPT: Zeichne ein Märchenschloss mit einem Fluss, der durch das ganze Bild geht, dort hinter steht das Schloss. Das Schloss ist in einem Braunton und hat eine Backsteinwand.

Ein Märchenschloss wie ChatGPT es sieht, es ist überhaupt nicht realistisch und entspricht nicht der Eingabe.
Ein Märchenschloss wie ChatGPT es sieht, es ist überhaupt nicht realistisch und entspricht nicht der Eingabe.

Noch ist es nicht notwendig, euch Sorgen zu machen, um eure Jobs zu machen, wenn ihr Programmieranfänger seid. Das als erstes Beispiel zur Turtle, nun zeige ich dir, wie deine Schildkröte die ersten Schritte machen kann.

Einrichtung

Zu Beginn benötigst du keine direkte Installation von dem Turtle Modul, allerdings sollte Tkinter auf deinem System installiert sein, diese kannst du mit den folgenden Schritten ausführen, falls das erste Testprogramm mit folgender Meldung ModuleNotFoundError: No module named '_tkinter' fehlschlagen sollte, muss geprüft werden, ob deine Konfiguration richtig ist. Je nach Python Version wirst du auch sehr explizit darauf hingewiesen. In meinem Fall, als es mir passiert ist, hing es damit zusammen, dass ich pyenv verwende unter MacOS und keine passende Installation und Konfiguration gesetzt wurde bei der Installation der Python Version.

  import _tkinter # If this fails your Python may not be configured for Tk
    ^^^^^^^^^^^^^^^

In meinem Fall hatte die folgende Antwort von Stack Overflow geholfen: https://stackoverflow.com/a/60469203

Erste Abläufe kennenlernen und Programmieren

Um zu starten, müssen wir nur Turtle importieren und können einen Ablauf programmieren. Um es dir am Anfang zu vereinfachen, da es auch keine Performance kritische Anwendung ist, kannst du einfach alles aus dem Turtle Modul importieren. Bei einer späteren professionellen Verwendung solltest du nur die Teile von Modulen laden, die du auch wirklich benötigen wirst.

from turtle import *

Die Schildkröte vorwärts- und rückwärtsgehen lassen

Nun benötigen wir Begrifflichkeiten, um die Schildkröte bewegen zu können. Dafür gibt es forward() und backward() in die Klammern setzt du ein Int oder Float ein, um zu definieren, welche Distanz zurückgelegt werden soll.

forward(100)
backward(100)

Mit dieser Bewegung können wir jetzt vor- und zurückgehen.

Die Schildkröte drehen

Es fehlt uns eine Option, um Drehungen zu realisieren, um in verschiedenste Richtungen gehen zu können. Dafür können wir die Funktion left und right verwenden. Wie der Name schon sagt, kann dort ein Wert eingegeben werden, der einer Gradzahl entspricht, um die sich die Schildkröte drehen soll, anschließend kannst du zum Beispiel wieder forward oder backward verwenden, um einen entsprechenden Strich zu zeichnen. Wenn du zum Beispiel forward mit left von 90 Grade verbindest, kannst du ein Quadrat oder Rechteck erstellen, mit vier Wiederholungen.

for i in range(0,4):
    forward(100)
    left(90)

Das Ergebnis würde aussehen, wie in dem Screenshot, wenn du die Gradzahl deutlich geringer einstellst, zum Beispiel auf 3 und das nach Vorn gehen auf einen Wert von 5 und die Wiederholung auf zum Beispiel 120 kannst du so auch einen Kreis erstellen.

Ein Quadrat erstellt mit Turtle Graphics.
Ein Quadrat erstellt mit Turtle Graphics.

Einen Kreis und eine Spirale von der Turtle erstellen lassen

Die Spirale sieht für dich wahrscheinlich erst einmal sehr komplex in der Erstellung aus, aber so komplex ist diese gar nicht, du brauchst „nur“ Halbkreise, die du mit immer kleineren Radien aneinander setzt.

Eine Spirale erstellt durch mehrere Halbkreise, die zusammengesetzt wurden.
Eine Spirale erstellt durch mehrere Halbkreise, die zusammengesetzt wurden.

Um das zu vereinfachen und nicht mit left und forward die Halbkreise erzeugen zu müssen, gibt es eine separate Funktion circle. Als erster Parameter kann ein Radius gesetzt werden und optional als zweiter Parameter eine Gradzahl, zum Beispiel 180° für einen Halbkreis (ein ganzer Kreis hat doch wie bekannt 360° Grad). Als dritter Parameter kann noch eine Schrittanzahl definiert werden, den letztlich kennt der Computer nur Geraden, aber dadurch das, die Gerade so kurz ist, entsteht der Eindruck eines Kreises. Wenn du zum Beispiel nur 4 Schritte verwendest und einen kompletten Radius, entsteht ein Achteck.

Unsere Spirale können wir also mit folgendem Code erstellen, umso geringer die Steps eingestellt werden in der Range umso dünner werden die Abstände zwischen den Linien.

for i in reversed(range(0, 400, 5)):
    print(i) # 395, 390, 385, 380, ..., 5, 0
    circle(i,180)

Texte schreiben mit der Turtle Graphics

Um einen Text zu schreiben mit der Turtle gibt es eine simple write Methode. Als ersten Parameter gibt man den Text, an, den man Schreiben möchte.

Weitere mögliche Parameter sind:

  • move → True/False, gibt an, ob die Schildkröte sich an das Ende des geschriebenen Textes bewegen soll oder nicht. Standardmäßig ist dieser Wert auf False.
  • align → Left, Center oder Right sind hier möglich Werte.
  • font → diese ist ein Tuple aus Schriftname, Schriftgröße, Schriftschnitt (italic, normal – je nach Schrift unterschiedlich)
write("Hello World!", font=("Barlow", 20, "normal"))

Die Positionierung basiert auf der aktuell aktiven Schildkröte.

Die Schildkröte und die Zeichenfläche visuell anpassen

Du hast nun gelernt, wie du verschiedene Bewegung realisieren kannst, mehr als diese Basis braucht es eigentlich nicht für komplexere Formen. Im folgenden Abschnitt wollen wir einmal betrachten, wie du das Styling der Zeichenfläche und der Schildkröte anpassen kannst.

Ein anderes Symbol für die Schildkröte verwenden

Es gibt verschieden Symbole, die du für die Turtle verwenden kannst, standardmäßig ist es noch nicht mal eine Schildkröte, die sich über den Bildschirm bewegt, sondern ein Dreieck, das wollen wir ändern.

Es gibt 6 Symbole, die möglich sind: arrow, turtle, circle, sqaure, triangle, classic.

Die Funktion, um eine echte Schildkröte auf dem Bildschirm zu haben, heißt shape('turtle') anschließende wechselt das Symbol. Es ist auch möglich, zwischendurch zwischen verschiedenen Shapes zu wechseln.

Unterschiedliche Farben und Größen für die Linien

Um die Farben zu definieren, gibt es die color Funktion mit dieser kannst du eine Stiftfarbe und eine Füllfarbe definieren.

color("#ef4136", "#EB958F")

Die Hintergrundfarbe kannst du mit bgcolor definieren. Es gibt fest Farbwerte, die immer verwendet werden können, oder auch HEX Farben sind möglich.

Um die Dicke der Linien zu definieren, gibt es die pensize dort drüber kann die Strichstärke definiert werden.

pensize(5)

Aufgabe für Einsteiger – das Schildkrötenrennen!

Um nun das wissen, was ihr in diesem Artikel gesammelt habt, gebe ich euch noch eine Aufgabe mit an die Hand – unten findet ihr noch meine vollständige Lösung zu dieser Aufgabe. Schaut euch meine Ergebnisse erst an, wenn ihr nicht mehr weiter kommen solltet.

Ausgabe eines Schildkrötenrennens mit 20 verschiedenen Schildkröten. Goldenrod gewinnt das Rennen an der Ziellinie.
Ausgabe eines Schildkrötenrennens mit 20 verschiedenen Schildkröten. Goldenrod gewinnt das Rennen an der Ziellinie.

Der Screenshot zeigt sehr deutlich, was die Aufgabe ist, es geht darum etliche Schildkröten parallel gegen einander laufen zu lassen.

Folgende Schritte müssen programmiert werden:

  1. Die verschiedenen Schildkröten müssen erstellt werden, dafür legst du dir am besten ein Tuple mit Farben und Namen der Schildkröten an.
  2. Die Schildkröten müssen auf ihre Startpositionen gesetzt werden, das kannst du entweder mit der Option goto machen oder mit den Bewegung Optionen, die du bereits kennengelernt hast.
  3. Anschließend kann die Ziellinie eingezeichnet werden. Ein Tipp hier noch ist die Option pendown und penup so kannst du eine Schildkröte bewegen, ohne dass sie eine Linie zeichnet.
  4. Anschließende kannst du eine Endlosschleife erstellen, innerhalb dieser Iterierst du über die Schildkröten Liste, bis es eine übers Ziel schafft, über turtle.pos()[0] erhältst du die jeweilige X Position, um dieses Auszuwerten. Dafür benötigst du einen Zufallsoption – wie du einen Zufall generieren kannst, habe ich in dem Artikel „Zufällige Zahlen generieren in Python mit dem Random Modul“ beschrieben. Zusätzlich kannst du noch eine kleine zufällige Abweichung nach Links und Rechts implementieren, um die Spannung zu erhöhen.
  5. Nun kannst du noch eine kreative Nachricht auf dem Bildschirm ausgeben, um den Gewinner bekannt zu geben.

Ein Punkt wurde noch nicht erklärt, und zwar wie du mit mehreren Schildkröten arbeiten kannst. Hier einmal ein kurzes Code-Beispiel zeigt, dass du mittels der Funktion Turtle deine Schildkröten erstellen kannst, anschließende kannst du alle bekannten Methoden, auf die Schildkröten anwenden.

first = Turtle("turtle")
second = Turtle("turtle")

first.forward(10)
second.backward(10)

Lösungsvorschlag (Achtung Spoiler!)

In meinem Lösungsvorschlag habe ich mir eine Funktion erstellt für die Startpositionen, da diese immer relative, in bestimmten Abständen zueinander platziert werden sollen.

Für die Gewinner Nachricht nutze ich die Schildkröte selbst kurz, um diese in einem bestimmten Abstand über der Schildkröte zu platzieren, anschließende verschiebe ich die Schildkröte wieder an ihre ursprüngliche Postion, ohne dass sie eine Spur hinterlässt durch penup.

from random import randint
from turtle import *

def startPositon(turtle, line):
    turtle.penup()
    turtle.speed(100)
    turtle.backward(600)
    turtle.left(90)
    turtle.backward(450)
    turtle.forward(line * 5)
    turtle.right(90)
    turtle.forward(1)
    turtle.pendown()
    turtle.speed(3)

def setupMessage(turtle, name):
    turtle.speed(200)
    turtle.hideturtle()
    turtle.penup()
    turtle.left(90)
    turtle.forward(10)
    turtle.right(90)
    turtle.forward(15)
    turtle.write(name + " is Winning the Race!", font=("Barlow", 20, "normal"))
    turtle.backward(15)
    turtle.left(90)
    turtle.backward(10)
    turtle.right(90)
    turtle.showturtle()
    turtle.speed(3)

bgcolor("#323638")

# Erstellen der Schildkröten
ourTurtles = list()
ourTurtlesData = [
    ("sunny", "#FFD700"),
    ("ruby", "#AA0A20"),
    ("ocean", "#008080"),
    ("sky", "#87CEEB"),
    ("grass", "#8FBC8F"),
    ("lavender", "#E6E6FA"),
    ("peach", "#FFE5B4"),
    ("teal", "#008080"),
    ("coral", "#FF7F50"),
    ("emerald", "#50C878"),
    ("rose", "#FF007F"),
    ("indigo", "#4B0082"),
    ("mustard", "#FFDB58"),
    ("navy", "#000080"),
    ("maroon", "#800000"),
    ("silver", "#C0C0C0"),
    ("goldenrod", "#DAA520"),
    ("violet", "#EE82EE"),
    ("cherry", "#DE3163"),
    ("magenta", "#FF00FF"),
]

for i, data in enumerate(ourTurtlesData):
    turtle = Turtle("turtle")
    turtle.hideturtle()

    turtle.color(data[1])

    ourTurtles.append([turtle, data[0]])

    startPositon(turtle, i * 10)
    turtle.showturtle()

# Erstellen der Ziel Linie
line = Turtle()
line.hideturtle()
line.penup()
line.color("white")

line.speed(100)
line.goto(300, 1000)
line.pensize(5)
line.pendown()
line.right(90)
line.forward(2000)

while True:
    for turtleItem in ourTurtles:
        turtle = turtleItem[0]
        name = turtleItem[1]

        if turtle.pos()[0] >= 150:
            turtle.forward(randint(-10, 30))
        else:
            turtle.forward(randint(-5, 50))

        if randint(0, 75) == 10:
            turtle.left(randint(0, 5))

        if randint(0, 75) == 20:
            turtle.right(randint(0, 5))

        if turtle.pos()[0] > 300:
            setupMessage(turtle, name)
            done()

Zusammenfassung

Die Turtle ist eine tolle Option um erste Abläufe kennen zulernen und ein Programm zu erstellen, wo du auch einen visuellen Ablauf auf deinem Bildschirm sehen kannst. Letztlich arbeiten Grafikprogramme nach ähnlichen Prinzipien, die Stärken der Linien und weiteres sind bei SVGs zum Beispiel gespeichert und anhand von Pfaden wird bestimmt, wie die Linie verläuft.

Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Python mit Schildkröte und Turtle Modul, Abläufe programmieren!"!

Kommentar schreiben

Vom Autor Empfohlen
close