keyevents
Deutsch   English   

12. TASTATUREVENTS

 

 

DU LERNST HIER...

 

wie du den Programmablauf durch Drücken von Tastaturtasten beeinflussen kannst. Ähnlich wie bei den Mausevents, definierst du in einer Callbackfunktion was beim Drücken einer Tastaturtaste geschehen soll. Die Callbackfunktion wird nicht vom Programm, sondern beim Drücken einer Taste automatisch vom System aufgerufen.

 

 

MUSTERBEISPIELE

 

Beispiel 1: Beim Drücken der Taste r wird ein roter Kreis, Taste b ein blauer und Taste g ein grüner Kreis gezeichnet.

Du definierst eine Callbackfunktion onKeyPressed(key) . Diese gibt den Name oder den nummerischen Code der gedrückten Taste zurück. Mit dieser Tastatur-Eingabe kannst du die Farbe auf rot, blau oder grün setzen. Danach wird ein gefüllter Kreis in der gewählten Farbe gezeichnet.

Über einen Parameter von makeGPanel() wird die Callbackfunktion registriert. So teilst du dem System mit, dass es diese Funktion bei jedem Tastaturklick aufrufen soll.

 

Nach dem Programmstart musst du zuerst mit der Maus in das Grafikfenster klicken, sonst werden die Tastaturklicks im Editorfenster ausgeführt.

Programm:    

#Gp12a.py
from gpanel import *

def onKeyPressed(key):
    print(key)
    if key == 'r' or key == 82:
        setColor("red")
    elif key == 'b' or key == 66:
        setColor("blue")
    elif key == 'g' or key == 71:
        setColor("lime")    
    fillCircle(3)

makeGPanel(-10, 10, -10, 10, keyPressed = onKeyPressed)
print("Use key r, g, or b.")
► In Zwischenablage kopieren

 

 

Beispiel 2: Mit Cursortasten die Richtung ändern.
Dein Programm reagiert auf das Drücken der Cursortasten UP, DOWN, LEFT bzw. RIGHT. In der Callbackfunktion onKeyPressed(key) legst du in einer if-elif-Struktur fest, wie die Koordinaten beim Drücken einer dieser Taste geändert werden sollen. Beim WebTigerPython verwendest du den Tastenname , beim WebTigerJython den nummerischen Code.
Das Programm wartet in einer endlosen Schleife, bis eine Taste gedrückt wird und zeichnet eine kurze Linie in der entsprechenden Richtung

 

Da der Wert der Variablen x, y in einer Funktion geändert wird, müssen diese Variablen als global definiert werden.

Programm:    

#Gp12b.py
from gpanel import * 
 
def onKeyPressed(key):
    global x, y
    if key == 'ArrowUp' or key == 38:
        y += 2 
    elif key == 'ArrowDown' or key == 40:
        y -= 2
    elif key == 'ArrowLeft' or key == 37:
        x -= 2
    elif key == 'ArrowRight' or key == 39:
        x += 2  

makeGPanel(-100, 100, -100, 100, keyPressed = onKeyPressed)
x = 0
y = 0
setColor("lime")
lineWidth(5)
print("Use cursor keys to move the cursor!")

while True:
    draw(x, y)
► In Zwischenablage kopieren

 

Beispiel 3: Laufenden Zeichnungscursor steuern
Bei den Computergames wird die Tastatur oft zur Steuerung des Spielablaufs verwendet. Dein Beispiel ist eine erste Version eines Snake-Games. Beim ersten Drücken der Taste UP beginnt sich der Snake zu bewegen. Mir erneutem Drücken einer der 4 Cursortasten kannst du die Richtung ändern.
Das Beispiel eignet sich gut für eine sogenannte Zustandsprogrammierung. Mit Drücken der ersten Cursortaste wird der Snake in einen Zustand versetzt und bleibt in diesem Zustand so lange, bis er durch Drücken einer anderen Cursor Taste in einen neuen Zustand versetzt wird.

 

In der Callbackfunktion legst du nur den Zustand fest. Die neuen Koordinaten werden in der Funktion setMove() bestimmt. Die Geschwindigkeit der Bewegung kannst du mit dem Befehl delay() regeln.

Programm:    

#Gp12c.py
from gpanel import *
 
def onKeyPressed(key):
    global state
    if key == 'ArrowUp' or key == 38:
        state = 'UP'
    elif key == 'ArrowDown' or key == 40:
        state = 'DOWN'
    elif key == 'ArrowLeft' or key == 37:    
        state = 'LEFT'
    elif key == 'ArrowRight' or key == 39:    
        state = 'RIGHT'

def setMove():
    global x, y
    if state == 'UP':
        y += 2 
    elif state == 'DOWN':
        y -= 2
    elif state == 'LEFT':
        x -= 2
    elif state == 'RIGHT':
        x += 2

makeGPanel(-100, 100, -100, 100, keyPressed = onKeyPressed)
x = 0
y = 0
setColor("lime")
lineWidth(5)
state = ''

while True:
    setMove()
    draw(x, y)
    delay(100)
► In Zwischenablage kopieren

 

Beispiel 4: Eine Animation mit Escape-Taste stoppen.
Laufende Anwendungen können häufig mit der Taste Escape beendet werden. In deinem Beispiel kannst du eine einfache Animation mit der Taste Escape anhalten und mit der Taste Enter starten. Diesen Vorgang kannst du beliebig oft wiederholen. Auf in diesem Beispiel wird in der Callbackfunktion nur der Zustand festgelegt und der Programmablauf in einer zweiten Funktion setMove() definiert. Auf hier musst du zuerst in das Grafikfenster klicken, bevor du die Taste Enter und Escape betätigst.

 

Programm:    

#Gp12d.py
from gpanel import *

def onKeyPressed(key):
    global state
    if key == 'Escape' or key == 27:
        state = 'stop'
    elif key == 'Enter' or key == 13:
        state = 'go'

def setMove():
    global x, dx
    if state == 'go':
        x = x + dx    
        if x > 80 or x < -80:
            dx = -dx
    elif state == 'stop':
        return  

makeGPanel(-100, 100, -100, 100, keyPressed = onKeyPressed)
x = 0
y = 0
dx = 1
state = ''

while True:
    setMove()
    pos(x, y)
    setColor("red")
    fillCircle(5)
    delay(10)
    setColor("white")
    fillCircle(5.2)    
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Die Callbackfunktion onKeyPressed(key wird nicht von deinem Programm, sondern vom System aufgerufen, wenn du eine Taste gedrückt hast. Die Bezeichnung der Tasten, insbesondere der Spezialtasten kannst du mit print(key) im Ausgabenfester anzeigen. Die Callbackfunktion wird als Parameter von makeGPanel() registriert. Die Callbackfunktion soll grundsätzlich keine längere Programmblocks enthalten.

 

 

ZUM SELBST LÖSEN

 

1.


Das Quadrat hat zu Beginn die Seitenlänge 20. Bei jedem Drücken der Taste UP soll das Quadrat vergrössert, beim Drücken der Taste DOWN verkleinert werden. Damit die Verkleinerung des Kreises sichtbar ist, muss du das vorher gezeichneten grössere Quadrat löschen (mit weissen Farbe übermalen).

 

 


2.
Ergänze das Programm im Beispiel 3 so, dass das Spiel beendet wird, wenn der Snake den Fensterrand berührt. im Ausgabefenster soll dann der Text "Game Over" erscheinen.  

3.

Du kannst das Snake-Spiel noch weiter entwickeln. Im richtigen Snake-Spiel darf der Snake die bereits gezeichnete Spur nicht kreuzen. dazu verwendest du die Funktion
getPixelColorStr(x, y), welche die Farbe im Punkt (x, y) zurückgibt.
Im WebTigerPython den Farbnamen (z.B. "red", "green" usw.)
Im WebTigerJython den hex-String (z.B. #ff0000, #00ff00 usw.).