K103: Zeichnen (Stift unten oder oben, Stiftdicke)

In diesem Blog lernst Du zu definieren, ob die Schildkröte bei ihren Bewegungen  «eine Spur hinterlässt» und wie dick diese Spur ist.

Inhaltsverzeichnis

Dieser Blog wird vom IAIP gratis zur Verfügung gestellt. Der Blog ist ein  Bestandteil des Kurses K103 «Programmieren mit Turtle Graphics» und gehört zur Lektion 3, Themenblock 1 (L3T1).

Der Kurs führt dich durch die einzelnen Blogs, enthält Zusatzmaterialien, Videos, viele Aufgaben mit Lösungen und Quizze zur Lernkontrolle. Der Kurs hat eine Kursgebühr von CHF 50.- Mit dem Einschreiben zum Kurs hilfst du mit, dass solche Blogs auch zukünftig noch gratis zur Verfügung gestellt werden können.

Einordnung

Bis anhin haben Bewegungen mit unserer Schildkröte (dem Cursor) jeweils immer zu einem Strich geführt. In diesem Themenblock lernst Du nun, wie man diese Eigenschaft gezielt steuern kann. Als erstes wollen wir einstellen, ob die Turtle bei Ihren Bewegungen «eine Spur hinterlässt» oder nicht.

Zeichen oder nicht: penup() und pendown()

Die Anweisung penup() (von engl. «pen»: «Stift» & von engl. «up»: «hoch») führt dazu, dass unsere Schildkröte keine Spuren mehr hinterlässt. Sie «zieht» den Stift hoch. Demgegenüber macht die Anweisung pendown() (von engl. «pen»: «Stift» & von engl. «down«: «runter»), dass unsere Schildkröte wieder eine Spur zieht. Sie «senkt» den Stift auf das Zeichenpapier. Die Anweisungen haben folgende Syntax:

turtle.penup()
turtle.pendown()

Anstelle von penup() kann man auch die abgekürzte Form pu() oder alternativ einfach nur up() verwenden. Anstelle von pendown() sind auch die abgekürzten Formen pd() oder down() zulässig.

Die Klammern sind jeweils leer. Das heisst, wir müssen Turtle Graphics keinen Wert übergeben. Der Stift ist entweder oben oder eben unten. Nachfolgend wiederum ein kleines Beispiel:

from turtle import *

forward(50)
penup()
forward(10)
pendown()
forward(50)

done()

Das Programm führt zu folgender Ausgabe:

In Zeile 4 wird mit der Anweisung penup() der Stift angehoben. Die Schildkröte bewegt sich in Zeile 5 trotzdem 10 Schritte nach vorne – zeichnet allerdings dabei keinen Strich.

Erst nachdem wir in Zeile 6 mit der Anweisung pendown() den Stift wieder gesenkt haben, führen Verschiebungen der Turtle wieder zu einem Strich auf dem Bildschirm.

Strichdicke definieren mit pensize()

Mit der Anweisung pensize(dicke(von engl. «pen»: «Stift» & von engl. «size»«Grösse») können wir zudem die Dicke der Spur unserer Schildkröte festlegen. Die Anweisungen hat folgende Syntax:

turtle.pensize(width=None)

Anstelle von pensize(width=None) kann man auch die Anweisung width(width=None) verwenden. Die zwei Sachen bewirken genau das Gleiche.

Das folgende Beispiel zeichnet ein Dreieck mit unterschiedlicher Dicke der einzelnen Seiten.

from turtle import *

forward(50)
left(120)

pensize(10)
forward(50)
left(120)

pensize(20)
forward(50)
left(120)

exitonclick()

Das Programm führt zu folgender Ausgabe:

Stiftdicke

Hinweis für Fortgeschrittene: pensize() abfragen

In der Syntax steht zwischen den Klammern der folgende Paramter: (width=None).

Wir werden diese Art der Parameterbeschreibung noch oft antreffen, insbesondere später im Zusammenhang mit optionalen Parametern.  Gemeint ist hier, dass man die Funktion auch ohne einen Wert aufrufen kann. Wir können also auch die Anweisung pensize() aufrufen. 

In diesem Fall verändern wir aber nicht die Strichdicke. Vielmehr teilt uns Python mit, welcher Wert gerade eingestellt ist. So können wir zur Laufzeit die Strichdicke ermitteln. Man kann dies gut in der Shell ausprobieren:

Verwendet man die Anweisung in einem Programm, so muss man den Rückgabewert in der Regel abspeichern, sprich einer Variable bzw. einem Namen zuordnen.

Das folgende Beispielprogramm wählt zufällig eine Strichdicke zwischen 5 und 10 Punkten, zieht einen Strich, verdoppelt diese anschliessend und zieht eine zweite Linie.

from turtle import *
import random

dicke = random.randint(5,10)  # zufällige Zahl 5-10
pensize(dicke)
forward(50)

dicke_neu = 2*pensize()
pensize(dicke_neu)
forward(50)

exitonclick()

Selbstverständlich könnte man die Rückgabewerte auch direkt einsetzen:

from turtle import *
import random

pensize(random.randint(5,10))
forward(50)
pensize(2*pensize())
forward(50)

exitonclick()

Übungsaufgaben

Nachfolgend findest Du ein paar Übungsaufgaben. 

Lösungen zu den Aufgaben findest du im Kurs K103 «Programmieren mit Turtle Graphics «: 
Lektion 3, Themenblock 1 (L3T1).

Aufgabe 1: Audi Logo

Versuche die rechts abgebildete Figur nachzuzeichnen.

Bonusaufgabe für den Unterricht: Ganz ähnlich funktioniert das olympische Signet. Versuche dieses zu zeichnen (drei Kreis oben, 2 Kreise unten)

Aufgabe 2: Dreieck mit Unterbruch

Versuche die rechts abgebildete Figur nachzuzeichnen.

Bonusaufgabe für den Unterricht: Versuche die Ecken jeweils abzurunden. Du kannst auch ein Dreieck in einem anderen Dreieck zeichnen.

Aufgabe 3: Vier Quadrate

Versuche die rechts abgebildete Figur nachzuzeichnen.

Bonusaufgabe für den Unterricht: Zeichne ein grosses Viereck um die 4 Quadrate herum. Runde bei diesem die Ecken ab.

Aufgabe 4: Yin & Yang Teil II

Versuche die rechts abgebildete Figur nachzuzeichnen.

Aufgabe 5: Kreativaufgabe I: lachendes Gesicht

Versuche ein ein lachendes Gesicht zu zeichnen. Du kannst dabei für Mund, Nase und Augen jeweils die Strichdicke verändern.

Bonusaufgabe für den Unterricht: Du kannst die Augen auch malen, indem du einen Punkt mittels der dot() Anweisung setzt. Zeichen so zwei blaue Augen! Oder zeichne noch besser zwei Punkte in den Kreisen der Augen. Sind diese Punkte nicht in der Mitte der Kreise, so schaute unser Gesicht in die eine oder andere Richtung. Am Ende der Mundecken kannst du ferner zwei Stempelabdrücke der Schildkröte machen.

Aufgabe 6: Kreativaufgabe II: Haus mit Fenster

Zeichne ein Haus mit Fenster.