Jython HomeDruckenJava-Online

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)
 
Ausführen mit Webstart

 

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)
 
Ausführen mit Webstart

 

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)
 
Ausführen mit Webstart

 

Erklärungen zum Programmcode:

wrap(): die Turtle wird in den Wrap-Modus versetzt, damit sie nicht aus dem Fenster nih hinauslaufen kann
while(True) : die Turtle läuft in einer endlosen while-Schleife

 

Beispiel 4: Zwei Turtles sollen mit den Tasten x und y bewegt werden. Wenn man die Taste x drückt, bewegt sich die erste Turtle 30 Schritte vorwärts, wenn man die Taste y gedrückt wurde, bewegt sich die zweite Turtle 30 Schritte vorwärts.

Die Turtles t1 und t2 werden in einem TurtleFrame erzeugt und an verschiedene Positionen gesetzt. In der Callbackfunktion onKeyPressed() wird zuerst der Code der gedrückten Taste zurückgeholt und in der Statusbar angezeigt. Die Callbackfunktion wird beim TurtelFrame tf registriert

# Tu11c.py

from gturtle import *

def move(t): 
    t.forward(30)
   
def onKeyPressed(key):
    code = tf.getKeyCode()
    tf.setStatusText("Code: " + str(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,-250)
t2.setPos(-100,-250)
tf.addStatusBar(20)
tf.setStatusText("Press x or y")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 
Ausführen mit Webstart

 

Erklärungen zum Programmcode:

tf = TurtleFrame(keyPressed = onKeyPressed): der Callback wird registriert
tf.getKeyCode() : gibt den Code der gedrückten Taste zurück

 

Zweite Lösung: Man kann auch mit t = makeTurtle(keyPressed = onKeyPressed) eine globale Turtle erzeugen und den Callback registrieren. Die zweite Turtle wird mit t2 = Turtle(t) ins Fenster der globalen Turtle gesetzt. Dadurch benötigt man kein TurtleFrame und das Programm wird einfacher.

# Tu11d.py

from gturtle import *

def onKeyPressed(key):
    code = getKeyCode()
    setStatusText("Code: " + str(code))
    if code == 88: # x
        forward(30)
    elif code == 89: # y
        t2.forward(30)
 
t = makeTurtle(keyPressed = onKeyPressed)
t2 = Turtle(t)
setPos(100,-250)
t2.setPos(-100,-250)
addStatusBar(20)
setStatusText("Press x or y")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 


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.