100%

retosenn

Profil

Courses

1
Programmieren mit Turtle Graphics
Expires After: Does not Expire

In diesem Blogbeitrag lernst du, wie man die Schildkröte mit Tasten steuern kann.

Table of Contents

Snake

Originalversion

Einordnung

Das Programm dient als Fallbeispiel für Funktionen zur Erläuterung von Tastatur- Ereignissen.  

Grundversion

Tastatursteuerung

Bevor wir mit dem eigentlichen Programm starten, benötigen wir etwas Theorie. Mit dem Turtle-Modul können wir erkennen, dass bzw. sobald ein Benutzer eine bestimmte Taste auf der Tastatur drückt (oder die Maus bewegt / geklickt hat). Immer wenn der Benutzer eine solche Aktion ausführt, sprechen wir von einem Ereignis (engl: event) – es ist etwas passiert bzw. etwas hat sich ereignet. Das Ereignis «a» bedeutet in unserem Fall, dass ein Benutzer die Taste a gedrückt hat. In der Bibliothek turtle hat es also Befehle, mit welchen wir sogenannte Tastatur-Ereignisse «abfangen» können. Sie sagen uns, dass beispielsweise gerade die Taste a gedrückt wurde. 

Die Idee ist nun ganz einfach: Wenn wir erkennen können, dass gerade ein Ereignis passiert ist (also ein Benutzer eine bestimmte Taste gedrückt hat), dann können wir dem Computer sagen, dass er etwas spezielles machen soll. In unserem Fall können wir das ausnutzen, um die Schildkröte je nach Tastatureingabe in die eine oder andere Richtung zu schicken.

Was benötigen wir also hierzu? Wir brauchen drei neue Anweisungen, namentlich die Befehle onkey(), listen() und mainloop(). Betrachten wir als erstes das nachfolgende Beispielprogramm:

from turtle import *

def k1():
    forward(10)

def k2():
    back(10)

def k3():
    right(90)

def k4():
    left(90)


onkey(k1, "f")
onkey(k2, "b")
onkey(k3, "r")
onkey(k4, "l")

listen()

mainloop()

Keypress Ereignisse festlegen mit onkey()

Der eigentliche Kern unseres Programms steht in den Zeilen 16-19. Mit der Anweisung onkey() wird festgelegt, was bei einem bestimmten Ereignis geschehen soll. Sie hat die folgende Syntax:

turtle.onkey(function, event)

Die Anweisung besteht aus dem Namen onkey und zwei Angaben, welche man in die Klammer schreibt.  An erster Stelle kommt ein Funktionsname, an zweiter Stelle ein Ereignis. Der Befehl onkey(k1, «f») bedeutet dann übersetzt etwa: Sobald das Ereignis «f» passiert, rufe die Funktion k1 auf. 

Auf diese Weise können wir dem Computer relativ einfach mitteilen, was er genau machen soll, wenn eine bestimmte Taste gedrückt wurde. In unserem Beispiel geht die Schildkröte um 10 Schritte geradeaus. Drückt der Benutzer die Taste «b«, so wird die Funktion k2 aufgerufen und unsere Schildkröte bewegt sich rückwärts.

Die Ziffern und Buchstabentasten werden durch das jeweilige Zeichen bezeichnet, also beispielsweise «5" für die Taste 5 oder «d" für die Taste D. Die Funktionstasten werden ebenfalls durch sich selbst bezeichnet, d.h. durch F und die zugehörige Nummer (beispielsweise «F1"). Es folgen einige ausgewählte Beispiele weiterer Tastenbezeichnungen.

  • Leertaste:  space
  • Plus Taste: plus
  • Minus Taste: minus
  • Rücktaste: BackSpace
  • Tabulator: Tab
  • Eingabetaste: Return
  • Esc: Escape
  • Cursor links: Left
  • Cursor hoch: Up
  • Cursor rechts: Right
  • Cursor runter: Down
  • Ende: End
  • Entf: Delete

Listener: die listen() Anweisung

Als zweites benötigen wir einen sogenannten Listener. Das Wort kommt aus dem englischen und bedeutet Zuhörer. Wir können auf Ereignisse warten und Funktionen auslösen, wenn wir das Ereignis «hören».  Wie ist das gemeint? 

Stelle dir vor, dass es ja ganz viele verschiedene Programme gibt, welche gerade auf deinem PC laufen. Der Internet Browser, der Python Interpreter oder das Turtle Graphics Fenster aus dem obigen Programm sind nur 3 Beispiele davon.  Wie kann der Computer wissen, für bzw. in welchem Programm gerade eine Taste gedrückt wurde?

Aus diesem Grund benötigen wir den Listener. Er stellt sicher, dass die Tastatureingabe von unserem Programm und nicht von einem anderen Programm «gehört» wird. Er macht im übertragenen Sinne, dass das Betriebssystem die Tastatureingabe des Benutzers an unser Fenster und nicht an irgendein anderes Fenster weiterleitet

In unserem Programm starten wir den Listener in Zeile 21. Die Anweisung hat folgende Syntax:

turtle.listen()

Den Listener zu starten, geht also ganz einfach. Du brauchst nur listen() zu schreiben.

Exkurs: die mainloop() Anweisung

In unserem Beispielprogramm hat es ganz am Ende, in Zeile 23, noch eine Anweisung mainloop(). Wir benötigen diese, dass unser Programm nicht beendet ist, bevor wir überhaupt erst eine Taste gedrückt haben. Es gibt verschiedene Möglichkeiten, um sicherzustellen, dass ein Programm nicht beendet wird. Im Zusammenhang mit keypress Ereignissen trifft man häufig auf die oben im Programm verwendete mainloop() Anweisung.

mainloop() ist die letzte Anweisung in einem Python Programm. Sie startet eine Ereignisschleife und ruft die sogenannte Mainloop-Funktion von Tkinter auf. Bei den aktuellen Versionen des turtle Moduls reicht es aber auch einfach, wenn wir am Ende des Programms in gewohnter Weise exitonclick() eingeben:

# Bibliothek importieren
from turtle import *

# Funktionen zu Key - Events

def k1():
    forward(10)

def k2():
    back(10)

def k3():
    right(90)

def k4():
    left(90)

# Key Events festlegen und Listener starten
onkey(k1, "f")
onkey(k2, "b")
onkey(k3, "r")
onkey(k4, "l")

listen()

# Ende
exitonclick()

Simulation I

Zum Abschluss passen wir unser Programm noch etwas an. Zusammenfassend ergibt sich der nachfolgende Code. Studiere den Code. 

# Bibliothek importieren
from turtle import *

# Funktionen zu Key - Events
def k1():
    setheading(90)

def k2():
    setheading(180)

def k3():
    setheading(270)

def k4():
    setheading(0)

# Key Events festlegen und Listener starten
onkey(k1, "Up")
onkey(k2, "Left")
onkey(k3, "Down")
onkey(k4, "Right")
listen()

# Hauptteil / Schlaufe
speed(1)
for i in range(2000):
    forward(1)

# Ende
exitonclick()