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

 


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.