Diesen Sonnabend haben wir uns wieder mit dem Programmieren in der Sprache Python beschäftigt. Die Idee war, eine Uhr mit Ziffernblatt und Zeigern auf dem Bildschirm zu malen. Die Uhr soll dann jede Minute die aktuelle Zeit anzeigen.
Ein einsteigerfreundlicher Weg, um Bilder zu malen ist die Python-Bibliothek turtle. Die Idee für die Schildkröten-Graphiken kommen von Seymour Papert, der in den 1960er Jahren die Lernsprache Logo entwickelte. Eine Umsetzung dieser Idee ist in der Python-Bibliothek turtle zu finden. Diese ist schon bei jedem Python dabei und braucht nicht extra installiert zu werden.
- Anleitung und Dokumentation für die Python Turtle Bibliothek (auf Englisch)
- Kurzanleitung für Python turtle (auf Deutsch)
Male mir ein Schaf
Der Einfachheit wegen beginnen wir mit einer quadratischen Kiste. Dazu muss die Schildkröte nur ein Stück laufen, sich 90 Grad drehen, weiterlaufen, wieder drehen und so weiter.
import turtle
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
Zwei Kisten
import turtle
turtle.shape("turtle")
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.left(10)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
Wenn wir eine Kiste zeichnen und dann die Schildkröte ein wenig drehen und dann wieder eine Kiste zeichnen, wird es schon interessanter.
Jetzt müssten wir das nur noch 36 mal wiederholen, um den Kreis voll zu bekommen. Das wird ziemlich unübersichtlich…
Eckige Mandalas
import turtle
turtle.shape("turtle")
for i in range(36):
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.forward(200)
turtle.left(90)
turtle.left(10)
Glücklicher Weise kann python für uns Befehlsblöcke wiederholen. Dies erreicht man mit der for-Schleife. Eine umfangreiche Erklärung gibt es z.B. hier: https://www.sivakids.de/python-for-schleife/
Welche Stunde hat geschlagen?
Die aktuelle Uhrzeit ausgeben
Die Bibliothek datetime erlaubt es, die aktuelle Uhrzeit und Datum zu erfahren. Dann kann man mit der Stunde und Minute und Sekunde zum Beispiel eine Zeichenkette füllen und in der Konsole ausgeben.
Mit der Funktion sleep aus der Bibliothek time schlafen wir 10 Sekunden. Durch die unendliche Wiederholung mit while True:
wird danach wieder die aktuelle Zeit ausgegeben und wieder geschlafen.
import datetime
import time
while True:
jetzt = datetime.datetime.now()
h = jetzt.hour
m = jetzt.minute
s = jetzt.second
print( "jetzt: %d:%d:%d" % (h,m,s) )
time.sleep(10) # 10 Sekunden schlafen
Ein Ziffernblatt malen
Mit turtle.speed(9)
stellen wir die Geschwindigkeit der Schildkröte ein. 1 ist am langsamsten und 10 ist am schnellsten.
Mit turtle.up()
und turtle.down()
hebt bzw. senkt man den Stift, so dass nicht alle Bewegungen eine Linie auf dem Bildschirm produzieren.
Mit turtle.goto(x,y)
geht die Schildkröte an die gewünschte Position. Das turtle.setheading(winkel)
setzt die Blickrichtung der Schildkröte, wobei 0 Rechts, 90 nach oben usw. ist.
Mit turtle.write(text)
kann man einen Text an die aktuelle Position schreiben. Wir geben hier den aktuellen Wert der Variable i
aus. Die Schleife läuft mit i
über die Zahlen 12,1,2 usw. bis 11.
import turtle
turtle.speed(9)
radius = 300
turtle.up()
turtle.goto(0, -radius)
turtle.setheading(0)
turtle.down()
turtle.circle(radius)
turtle.up()
turtle.goto(0, 0)
turtle.setheading(90)
for i in (12,1,2,3,4,5,6,7,8,9,10,11):
turtle.forward(radius-20)
turtle.down()
turtle.write(i)
turtle.forward(25)
turtle.up()
turtle.right(30)
turtle.goto(0, 0)
Die Zeiger malen
Angenommen, wir haben wir aktuelle Stunde und Minute. Daraus müssen wir zunächst den Winkel der Zeiger ausrechen. Wir haben das relativ zur 0-Uhr Position gemacht. Jede Stunde bewegt den Stundenzeiger 30 Grad weiter. Jede Minute bewegt den Stundenzeiger um 0,5 Grad weiter. Jede Minute bewegt den Minutenzeiger um 6 Grad weiter.
Etwas aufpassen muss man mit Python Befehlen, wenn sie über mehrere Zeilen gehen. Um versehentliche Tippfehler besser entdecken zu können, muss man explizit hinschreiben, wenn ein Befehl auf der nächsten Zeile weiter geht. Dies erfolgt durch das Zeichen \
am Zeilenende. Ausnahmen gibt es, für Programmcode zwischen Klammern (
und )
, sowie Zeichenketten zwischen """
und """
.
import turtle
radius = 300
stunde = 11
minute = 55
winkel_stunde = \
(stunde % 12) * 360/12 \
+ minute * 360/12/60
winkel_minute = minute * 360/60
turtle.up()
turtle.goto(0, 0)
turtle.setheading(90-winkel_stunde)
turtle.down()
turtle.forward(radius*0.5)
turtle.up()
turtle.goto(0, 0)
turtle.setheading(90-winkel_minute)
turtle.down()
turtle.forward(radius*0.75)
turtle.up()
turtle.goto(0, 0)
Alles zusammenfügen
Nun müssen nur noch diese drei Ideen zu einem Programm zusammengefügt werden. Dies bleibt dem geneigten Leser als Fingerübung überlassen. Das Ergebnis sieht dann aus wie in dem Video.
Kleiner Tipp: Mit turtle.pensize(breite)
kannst Du die Breite der Linien verändern.
Sprachausgabe hinzufügen
Die Bibliothek pyttsx3 ermöglicht eine einfache Sprachausgabe. Wir holen uns mit datetime die aktuelle Stunde und Minute. Dann setzen wir daraus eine Zeichenkette zusammen. Diese wird an pyttsx3 übergeben. Falls alles klappt, hört man was im Lautsprecher.
import pyttsx3
import datetime
import time
engine = pyttsx3.init()
while True:
jetzt = datetime.datetime.now()
h = jetzt.hour
m = jetzt.minute
text = "Jetzt ist es %d Uhr %d" \
% (h,m)
engine.say(text)
engine.runAndWait()
time.sleep(50) # 50 Sekunden