3.3 Das Modul Turtle#
In der Informatik bezeichnet man Grafiken, die dadurch entstehen, dass ein Roboter Linien auf eine Leinwand zeichnet, als Turtle-Grafiken. Der Roboter wird durch einfache Kommandos gesteuert. Er besitzt eine bestimmte Position (x- und y-Koordinaten in einem kartesischen Koordinatensystem) und eine Ausrichtung. Auch der “Stift” des Roboters kann angepasst werden – zum Beispiel in Farbe oder Linienstärke.
Python bringt bereits ein Modul namens turtle
mit, um solche Grafiken zu
erstellen. Da wir jedoch in dieser Vorlesung mit Jupyter Notebooks arbeiten,
verwenden wir das Modul ColabTurtlePlus
. Es erweitert die Standardfunktionen
und ist speziell für den Einsatz in Notebooks geeignet.
Hinweis: Installation notwendig
Das Modul colabTurtlePlus ist kein Standardmodul und muss daher nachinstalliert werden. Bitte beachten Sie die Hinweise zur Installation “Module nachinstallieren” und die dazugehörige Mini-Übung unten. Falls Sie mit JupyterLite arbeiten, verwenden Sie bitte
%pip install -q ColabTurtlePlus
Lernziele#
Lernziele
Sie können ein fehlendes Modul mit conda oder pip nachinstallieren.
Sie wissen, was eine Turtle-Grafik ist.
Sie können das Modul colabTurtlePlus importieren.
Sie können ein Roboterfeld initalisieren und den Roboter mit einfachen Kommandos über das Roboterfeld steuern.
Module nachinstallieren#
Um ein Python-Modul bzw. ein Python-Paket aus einem Jupyter Notebook nachzuinstallieren, gibt es grundsätzlich zwei Möglichkeiten: mit conda oder mit pip. Conda ist ein Paket-Manager, der in der Anaconda-Distribution enthalten ist und in der Regel für die Installation von Python-Paketen verwendet wird, während pip ein Paket-Manager ist, der mit Python selbst installiert wird.
Hier sind Schritt-für-Schritt-Anleitungen, wie man ein Python-Modul mit conda oder pip in einem Jupyter Notebook nachinstallieren kann.
Installation mit conda#
!conda install <paketname>
Ersetzen Sie <paketname>
durch den Namen des gewünschten Pakets.
Nutzen Sie diese Methode bevorzugt, wenn Sie mit der Anaconda-Distribution arbeiten.
Installation mit pip#
%pip install <paketname>
Verwenden Sie pip
, wenn das Paket nicht in der Anaconda-Distribution enthalten
ist. Diese Variante funktioniert auch zuverlässig in Google Colab oder
JupyterLite.
Wichtig: Vermischen Sie conda und pip nicht für dasselbe Paket. Das kann zu Fehlern führen.
Wann conda und wann pip?#
Es ist wichtig zu beachten, dass conda und pip unterschiedliche Paket-Repositories verwenden. Wenn ein Paket mit conda installiert wurde, sollte es nicht mit pip aktualisiert oder deinstalliert werden, da dies zu Inkompatibilitäten führen kann. Umgekehrt sollte ein mit pip installiertes Paket nicht mit conda aktualisiert oder deinstalliert werden.
In dieser Vorlesung arbeiten wir mit der Anaconda-Distribution. Sie sollten also immer zuerst versuchen, das fehlende Modul mit conda nachzuinstallieren. Nur wenn es nicht in der Anaconda-Distribution enthalten ist, nehmen Sie bitte pip. Die beiden folgenden Links verlinken auf die Liste der verfügbaren Pakete:
Mini-Übung
Installieren Sie jetzt das Modul ColabTurtlePlus
, das leider nicht in der
Anaconda-Distribution enthalten ist. Mehr Details zu diesem Modul finden Sie
unter
https://pypi.org/project/ColabTurtlePlus/.
Lösung
%pip install -q ColabTurtlePlus
Ein Turtlefeld initalisieren#
Als erstes werden alle Funktionalitäten des Turtle-Moduls geladen. Die typische
Abkürzung für dieses Modul ist turtle
.
import ColabTurtlePlus.Turtle as turtle
Put clearscreen() as the first line in a cell (after the import command) to re-run turtle commands in the cell
Es erscheint eine Meldung, nämlich der Hinweis: “Put clearscreen() as the first
line in a cell (after the import command) to re-run turtle commands in the
cell”. Mit dem Kommando turtle.clearscreen()
wird ein Turtlefeld initalisiert
und gleichzeitig können später die vorhandenen Grafiken damit gelöscht werden,
wenn die Code-Zelle erneut ausgeführt wird.
Mit dir(turtle)
können wir erkunden, was an Funktionalitäten vorhanden ist.
dir(turtle)
['DEFAULT_ANGLE_MODE',
'DEFAULT_BACKGROUND_COLOR',
'DEFAULT_BORDER_COLOR',
'DEFAULT_FILL_COLOR',
'DEFAULT_FILL_OPACITY',
'DEFAULT_FILL_RULE',
'DEFAULT_IS_PEN_DOWN',
'DEFAULT_MODE',
'DEFAULT_OUTLINE_WIDTH',
'DEFAULT_PEN_COLOR',
'DEFAULT_PEN_WIDTH',
'DEFAULT_SHEARFACTOR',
'DEFAULT_SPEED',
'DEFAULT_STRETCHFACTOR',
'DEFAULT_SVG_LINES_STRING',
'DEFAULT_TILT_ANGLE',
'DEFAULT_TURTLE_DEGREE',
'DEFAULT_TURTLE_SHAPE',
'DEFAULT_TURTLE_VISIBILITY',
'DEFAULT_WINDOW_SIZE',
'HTML',
'RawTurtle',
'SPEED_TO_SEC_MAP',
'SVG_TEMPLATE',
'Screen',
'TURTLE_ARROW_SVG_TEMPLATE',
'TURTLE_CIRCLE_SVG_TEMPLATE',
'TURTLE_CLASSIC_SVG_TEMPLATE',
'TURTLE_RING_SVG_TEMPLATE',
'TURTLE_SQUARE_SVG_TEMPLATE',
'TURTLE_TRIANGLE_SVG_TEMPLATE',
'TURTLE_TURTLE2_SVG_TEMPLATE',
'TURTLE_TURTLE_SVG_TEMPLATE',
'Turtle',
'VALID_COLORS',
'VALID_MODES',
'VALID_TURTLE_SHAPES',
'_Screen',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__func_body',
'__loader__',
'__name__',
'__package__',
'__spec__',
'_getmethparlist',
'_make_global_funcs',
'_screen_docrevise',
'_tg_screen_functions',
'_tg_turtle_functions',
'_turtle_docrevise',
'animationOff',
'animationOn',
'back',
'backward',
'begin_fill',
'bgcolor',
'bk',
'circle',
'clear',
'clearscreen',
'clearstamp',
'clearstamps',
'color',
'degrees',
'delay',
'display',
'distance',
'done',
'dot',
'down',
'drawline',
'end_fill',
'face',
'fd',
'fillcolor',
'filling',
'fillopacity',
'fillrule',
'forward',
'getcolor',
'getheading',
'getx',
'gety',
'goto',
'heading',
'hideborder',
'hideturtle',
'home',
'ht',
'initializeTurtle',
'initializescreen',
'inspect',
'isdown',
'isvisible',
'jumpto',
'left',
'line',
'lt',
'math',
'mode',
'oldDefaults',
'pd',
'pen',
'pencolor',
'pendown',
'pensize',
'penup',
'pos',
'position',
'pu',
'radians',
're',
'regularPolygon',
'reset',
'resetscreen',
'right',
'rt',
'saveSVG',
'seth',
'setheading',
'setpos',
'setposition',
'settiltangle',
'setup',
'setworldcoordinates',
'setx',
'sety',
'shape',
'shapesize',
'shearfactor',
'showSVG',
'showborder',
'showturtle',
'speed',
'st',
'stamp',
'sys',
'tilt',
'tiltangle',
'time',
'towards',
'turtles',
'turtlesize',
'up',
'update',
'width',
'window_height',
'window_width',
'write',
'xcor',
'ycor']
Dann folgen wir der Anweisung, zuerst das Kommando clearscreen()
zu benutzen.
turtle.clearscreen()
Es erscheint eine leere Leinwand, die 800 Bildpunkte breit ist und 600 Bildpunkte hoch ist. Bildpunkte werden normalerweise als Pixel bezeichnet, was wiederum mit px abgekürzt wird.
Als nächstes setzen wir einen Roboter mitten in das Feld. Der Roboter soll den
Namen Robo tragen. Da Variablen traditionell klein geschrieben werden, wird mit
der folgenden Code-Zeile ein Roboter-Objekt namens robo
initalisiert.
robo = turtle.Turtle()
Der virtuelle Roboter wird durch ein Dreieck gekennzeichnet. Die Spitze des Dreiecks zeigt in die Richtung, in die der Roboter aktuell schaut, also in die Bewegungsrichtung.
Der Roboter bewegt sich#
Der Roboter wird mit einfachen Befehlen wie vorwärts, links, rechts, usw. gesteuert. Die Befehle sind dabei der englischen Sprache entnommen. Da sie an den Roboter gerichtet sind, wird zuerst der Name des Roboters verwendet, dann ein Punkt gesetzt und zuletzt der Befehlsname geschrieben. In die runden Klammern kommen die Argumente, z.B. um wie viele Schritte der Roboter sich vorwärts bewegen soll.
Mit dem Befehl
robo.forward(schritte)
wird der Roboter vorwärts bewegt und legt insgesamt schritte
(gemessen in
Pixeln) zurück.
Mit den Befehlen
robo.left(winkel)
und
robo.right(winkel)
wird der Roboter nach links (gegen den Uhrzeigersinn) oder rechts (im
Uhrzeigersinn) gedreht. Der Drehwinkel wird durch die Variable winkel
in Grad angegeben.
Um jetzt den kompletten Code zusammen zu haben, wiederholen wir die bisherigen Code-Zeilen in der folgenden Code-Zelle und experimentieren dann in der übernächsten Code-Zelle mit der Steuerung des Roboters. Wenn Sie das Turtle-Feld wieder auf seinen Ausgangszustand zurücksetzen möchten, führen Sie erneut die Code-Zelle mit der Erzeugung und Initialisierung aus.
# Initalisierung des Feldes und Löschung bereits vorhandener Grafiken
turtle.clearscreen()
# Erzeugung eines Roboters mit Namen robo und Platzierung auf dem Feld
robo = turtle.Turtle()
# Robo bewegt sich
robo.forward(100)
robo.left(120)
robo.forward(50)
Mini-Übung
Lassen Sie den Roboter ein Rechteck der Länge 200 px und Höhe 100 px zeichnen. Am Ende soll der Roboter in die ursprüngliche Richtung hin ausgerichtet sein, also nach Osten bzw. rechts.
# Hier Ihr Code
Lösung
turtle.clearscreen()
robo = turtle.Turtle()
robo.forward(200)
robo.left(90)
robo.forward(100)
robo.left(90)
robo.forward(200)
robo.left(90)
robo.forward(100)
robo.left(90)
Anmerkung: natürlich hätten wir den Roboter auch viermal nach rechts drehen lassen können.
Robo kann noch mehr#
Die folgenden Befehle an den Roboter dienen zur Steuerung der Bewegung:
forward(schritte): Der Roboter bewegt sich vorwärts, die Streckenlänge wird in Schritten/Pixel
schritte
angegeben.backward(schritte): Der Roboter bewegt sich rückwärts, die Streckenlänge wird in Schritten/Pixel
schritte
angegeben.right(winkel): Der Roboter dreht sich nach rechts, der Winkel
winkel
wird in Grad angegeben.left(winkel): Der Roboter dreht sich nach links, der Winkel
winkel
wird in Grad angegeben.goto(x,y): Der Roboter läuft direkt zu der angegeben Position (x,y).
Der Stift wird mit folgenden Befehlen eingestellt:
penup(): Der Stift wird hochgehoben. Bewegt sich der Roboter, hinterlässt er keine Zeichnung.
pendown(): Der Stift wird abgesetzt, ab jetzt zeichnet der Roboter wieder.
pensize(breite): Die Breite der Striche wird eingestellt, z.B. ist
robo.pensize(10)
ein breiter Strich.
Für die Farbe gibt es das folgende Kommando:
pencolor(farbe): Ändert die Farbe der Striche, z.B. stellt der Befehl
robo.pencolor('red')
auf rote Farbe um. Die Farben werden als String übergeben und entsprechen den englischen Farben.
Mehr Details finden Sie in der Turtle-Dokumentation von ColabTurtlePlus.
Zum Abschluss noch eine Mini-Übung.
Mini-Übung
Lassen Sie den Roboter ein gleichseitiges Dreieck zeichnen. Die erste Seite soll rot sein, die zweite grün und die dritte blau.
# Hier Ihr Code
Lösung
turtle.clearscreen()
robo = turtle.Turtle()
robo.pencolor('red')
robo.forward(50)
robo.left(120)
robo.pencolor('green')
robo.forward(100)
robo.left(120)
robo.pencolor('blue')
robo.forward(100)
robo.left(120)
robo.pencolor('red')
robo.forward(50)
Zusammenfassung und Ausblick#
In diesem Kapitel haben wir uns mit Turtle beschäftigt. In den folgenden Kapiteln werden wir Turtle nutzen, um verschiedene Programmierkonstrukte kennenzulernen.