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.

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
Kategorien: DigitaltechnikElektronik