Tastatur - Events


Bei eventgesteuerten Programmen kann der Benutzer den Programmablauf durch Drücken von Tastaturtasten oder mit Mausklicks beeinflussen. Es verlangt eine neue Programmiertechnik: Man definiert Funktionen (Callbackfunktionen), die vom Programm nie aufgerufen werden, sondern vom System.

Bei Tastatur-Events wird bei einem Tastendruck ein keyPressed-Event ausgelöst und dabei eine Callbackfunktion aufgerufen, in der definiert wird, was beim Tastendruck geschehen soll. Der Callback erhält beim Aufruf durch das System im Parameter key die Information, welche Taste gedrückt wurde.

Beispiel 1: Beim Drücken einer beliebigen Taste wird eine Treppenstufe gezeichnet. Der numerische Code der gedrückten Taste wird in der Statusbar angezeigt.

# Tu11.py

from gturtle import *

def onKeyPressed(key):
    step()
    setStatusText("Code: " + str(key))

def step():
    forward(20)
    right(90)
    dot(10)
    forward(20)
    left(90)
  
makeTurtle(keyPressed = onKeyPressed)
hideTurtle()
setPos(-250, -250)
addStatusBar(20)
setStatusText("Press any key!")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

makeTurtle(keyPressed = onKeyPressed) : registriert die Callbackfunktion onKeyPressed (man teilt dem System mit, wie die Callbackfunktion heisst)
def onKeyPressed(key) : Callbackfunktion, legt fest was geschehen soll, wenn eine Taste gedrückt wird

 

Beispiel 2: Die Turtle kann mit den Cursor-Tasten nach links, rechts, oben bzw. nach unten bewegt werden.

Die Callbackfunktion onKeyPressed(key) liefert den numerischen Code der gedrückten Taste. Bei den Cursortasten sind es die Codes 37, 38, 39 und 40.

# Tu11a.py

from gturtle import *

def onKeyPressed(key):

    if key == 37:
        setHeading(-90)
        fd(10)
    elif key == 39:
        setHeading(90)
        fd(10)
    elif key == 38:
        setHeading(0)
        fd(10)
    elif key == 40:
        setHeading(180)
        fd(10)

makeTurtle(keyPressed = onKeyPressed)
speed(-1)
addStatusBar(20)
setStatusText("Use cursor keys to move me!")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

Mit if key == 37: falls die Taste LEFT mit dem nummerischen Code 37 gedrückt wurde
setHeading(-90) : dreht die Turtle gegen links

 

Beispiel 3: Die Richtung einer sich ständig bewegenden Turtle kann mit den Cursortasten LEFT, RIGHT, UP oder DOWN geändert werden. Damit die Turtle das Fenster nicht verlässt, verwendet man den Wrap-Modus. Ein typisches Beispiel einer Eventsteuerung. Falls keine Taste gedrückt wird, läft das Programm weiter und die Turtle bewegt sich hin und her. Unabhängig davon, in welchem Zustand sich das Programm befindet, wird mit Drücken der Cursor-Tasten Left, Right, Up bzw. Down ihre Richtung geändert.

Um den Programmcode übersichtlicher zu halten, verwenden wir anstelle der nummerischen Codes der Cursortaste die Variablen LEFT, RIGHT, DOWN und UP.

#Tu11b.py

from gturtle import *

LEFT = 37
RIGHT = 39
UP = 38
DOWN = 40

def onKeyPressed(key):
   if key == LEFT:
      setHeading(-90)
   elif key == RIGHT:
      setHeading(90)
   elif key == UP:
      setHeading(0)
   elif key == DOWN:
      setHeading(180)

makeTurtle(keyPressed = onKeyPressed)
wrap()
addStatusBar(20)
setStatusText("Use cursor keys to move me!")
while True:
    forward(10)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Beispiel 4: Zwei Turtles mit Drücken der Tastaturtasten bewegen. Mit Drücken der Taste X bewegt sich die Turtle t1 30 Schritte vorwärts, mit Drücken der Taste Y bewegt siche die Turtle t2 30 Schritte vorwärts. Ein Spiel dazu können Sie sich selbst ausdenken....

# Tu11c.py
from gturtle import *

def move(t): 
    t.forward(30)
   
def onKeyPressed(key):
    code = tf.getKeyCode()
    print(code)
    if code == 88: # x
       move(t1)
    elif code == 89: # y
       move(t2)

tf = TurtleFrame(keyPressed = onKeyPressed)
t1 = Turtle(tf)
t2 = Turtle(tf)
t1.setPos(100,-290)
t2.setPos(-100,-290)
t2.setColor("red")
tf.addStatusBar(20)
tf.setStatusText("Press x or y")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

tf.getKeyCode(): gibt den numerischen Code der gedrückten Taste zurück

 

Beispiel 5: Zwei Turtles abwechslungsweise mit Cursortaste steuern.
Falls man zwei Turtles mit Cursortasten steuern will, muss man dafür sorgen, dass die Turtle abwechlungsweise auf den Tastaturdruck reagieren. In diesem Beispiel verwendet man kein Turtleframe. Man erzeugt mit makeTurtel() die erste Turtle und dann mit t2 = Turtle(t1) die zweite Turtle im gleichen Playground. Ein Spiel dazu können Sie sich sebst ausdenken.

#Tu11d.py
from gturtle import *

def go(t):
    if k == 37:
        t.setHeading(-90)
    elif k == 39:
        t.setHeading(90)
    elif k == 38:
        t.setHeading(0)
    elif k == 40:
        t.setHeading(180)
    t.fd(20) 

t1 = makeTurtle()
t1.setPos(-50, 0)
t2 = Turtle(t1)
t2.setColor("red")
t2. setPos(50, 0)
t = t1

while True:
    k = getKeyCodeWait()
    print(k)
    go(t)
    if t == t1:
        t = t2
    else:
        t = t1  
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

t2 = Turtle(t1): erzeugt eine zweite Turtle im Playground der ersten Turtle
getKeyCodeWait(): wartet auf einen Tastendruck und gibt den nummerischen Code der gedrückten Taste zurück

 

 

 

 


Aufgaben Serie 11

1.

Beim Drücken der Taste "r" (Code 82) soll ein roter, Taste "g" Code 71) ein grüner und Taste "b" ein blauer gefüllter Kreis gezeichnet werden.

 

       
2.

Beim Drücken einer beliebigen Taste sollen zufällig 1, 2, 3, 4, 5, oder 6 gefüllte Kreise gezeichnet werden.

 

       
3.

Programmiere ein Turtle-Wettrennen:
Die beiden Turtle starten am unteren Rand des Fensters. Jedesmal, wenn eine belibige Taste gedrückt wird, bewegen sich die Turtles um eine zufällige Distanz von 10, 20, 30, 40, 50 oder 60 Schritten nach vorne. Diejenige Turtle, welche den oberen Rand des Fensters zuerst erreicht, gewinnt.

 

 


4.

Snake light:
Ergänze das Programm im Beispiel 3 so, dass es Strafpunkte gibt, wenn die Turtle über den Rand des Fensters hinaus läuft.

Die Strafpunkte können in der Statusbar angezeigt werden.

Du kannst auch das Turtle-Bild durch das Bild snakehead.gif ersetzen:

makeTurtle("sprites/snakehead.gif", keyPressed = onKeyPressed)

Das Bild ist im tigerjython2.jar enthalten.