buttons

12. BUTTONS

 

 

DU LERNST HIER...

 

wie man die Oxocard-Tasten (Buttons) verwendet, um interaktive Programme zu entwickeln.

 

 

Oxocard-Buttons

 

Die Oxocard verfügt über 6 Buttons, die über die vordefinierten Konstanten BUTTON_L1, BUTTON_L2, BUTTON_L3, BUTTON_R1, BUTTON_R2 und BUTTON_R3 ansprechbar sind.

Es gibt zwei Möglichkeiten, die Button-Werte zu erfassen:

  • Mit Pollen
    Es wird ständig abgefragt, ob ein Button gedrückt ist oder gedrückt wurde. Wenn dies der Fall ist, wird ein bestimmter Programmblock ausgeführt.
  • Mit Events
    Ein Buttonklick wird als Ereignis (Event) aufgefasst. Dabei wird automatisch eine Funktion (Callbackfunktion) aufgerufen, in welcher definiert ist, wie das Programm reagieren soll.

 

 

MUSTERBEISPIELE

 

Pollen, um den aktuellen Status (gedrückt/losgelassen) zu erfassen

Mit button = Button(BUTTON_R2) erzeugst du ein Objekt der Klasse Button, mit dem du den rechten unteren Button ansprechen kannst. Dazu musst du zuerst das Modul button importieren. Die Klasse stellt dir verschiedene Funktionen zur Verfügung, die man auch Methoden  nennt, da sie zu einer Klasse gehören.

Die Methode button.isPressed()

gibt True zurück, wenn der Button im Moment des Aufrufs gedrückt ist.

Dein Programm wartet in einer Endlosschleife, bis du den Button R2 drückst. Dann wird alle 0.1 Sekunden ein rotes Quadrat erscheinen und wieder verschwinden, und zwar so lange du den Button gedrückt hältst.

 

 



Programm:

from oxocardext import *
from oxobutton import *

button = Button(BUTTON_R2) 
while True:
    if button.isPressed():
        fillRectangle(2, 2, 4, 4, RED)
        sleep(0.2)
        clear()  
    sleep(0.2)
► In Zwischenablage kopieren


Pollen, um auf Klicken eines Buttons zu reagieren

So wie du es von den Mausklicks kennst, möchtest du hier mit einem Button-Klick eine Aktion ausführen. Du kannst aber ein kurzes Klicken nicht mit isPressed() erfassen, da dein Programm nicht mit Sicherheit gerade dann diese Funktion aufruft, wenn der Button gedrückt ist. Die Methode wasPressed() "erinnert" sich aber, ob der Button seit dem letzten Aufruf gedrückt und wieder losgelassen wurde.

In deinem Beispiel verwendest du den linken und den rechten unteren Button, um einen Pfeil nach links bzw. nach rechts zu zeichnen.

Das sleep(0.1) ist wichtig, damit du nicht unnötig viele Rechnerressourcen verschwendest, wenn das Programm nichts anderes machen muss, als zu überprüfen, ob ein Button gedrückt wurde.


 

Wenn du die Wartezeit auf 1 s erhöhst, kannst du demonstrieren, dass der Klick tatsächlich auch dann erkannt wird, wenn das Programm gerade schläft.

Programm:

from oxocard import *
from oxobutton import *

button1 = Button(BUTTON_R2)
button2 = Button(BUTTON_L2)

while True:
    if button1.wasPressed():
        clear()
        arrow(3, 3, 0, 5, RED) 
    if button2.wasPressed():
        clear()
        arrow(4, 3, 4, 5, BLUE)                 
    sleep(0.1) 
► In Zwischenablage kopieren

Buttons werden häufig dazu verwendet, um ein laufendes Programm zu beenden. Statt einer endlosen while-Schleife, lässt du die Schleife nur solange laufen, bis ein bestimmter Button geklickt wurde.

In deinem Beispiel bewegt sich die Schlange so lange auf dem Kreis, bis du den Button R2 klickst. Dann versteckst du sie mit hide().

 


Programm:

from oxosnake import *
from oxobutton import *

makeSnake(speed = 100)
button = Button(BUTTON_R2)
 
while not button.wasPressed():
    forward(2)
    right(45)
    sleep(0.1)   
hide()   
► In Zwischenablage kopieren

 

Buttonklicks als Events erfassen

Die Ereignissteuerung verlangt eine spezielle Programmiertechnik: Du definierst dazu in einer Funktion (Callbackfunktion), was beim Auftreten des Events (hier ein Buttonklick) geschehen soll. Die Callbackfunktion wird nie explizit von deinem Programm aufgerufen, sondern direkt vom System, wenn der Button geklickt wurde. Du teilst dem System den Namen deiner Callbackfunktion beim Erzeugen des Buttons mit, z.B. wenn die Callbackfunktion onEvent heisst:

Button(BUTTON_KONSTANTE, onEvent)

Man nennt dies auch "Registrieren des Callbacks".

Die Verwendung von Events ist insbesondere dann vorteilhaft, wenn du in ein laufendes Programm eingreifen willst. Im nächsten Beispiel bewegt sich die Schlange endlos auf einem Quadrat. Ohne die Bewegung zu unterbrechen, kannst du mit dem rechten Button die Länge der Schlange vergrössern.

Im Hauptprogramm musst du die Callbackfunktionen beim Erzeugen des Button R2 registrieren.

 



Programm:

from oxosnake import *
from oxobutton import *

def onClick(pin):
    growTail() 

makeSnake(pos = (0, 7))
Button(BUTTON_R2, onClick)

while True:
    forward(7)
    right(90)    
► In Zwischenablage kopieren

Globale Variablen in Callbackfunktionen

Du möchtest einen Klickzähler so realisieren, dass auf dem Display die Anzahl der Tastenklicks der Taste BUTTON_R2 angezeigt wird, Du speicherst in der Variablen count die Anzahl der Tastenklicks. Zuerst initialisierst du count auf 0 und stellst den aktuellen Wert ständig mit display() dar.

In der Callbackfunktion möchtest du count um eins erhöhen. In einer Funktion kannst du aber eine im Hauptprogramm definierte Variable nur dann verändern, wenn du sie als global bezeichnest.

 




Programm:

from oxocard import *
from oxobutton import *

def onClick(pin):
    global count
    count += 1

count = 0   
Button(BUTTON_R2, onClick)
while True:
    display(count)
    sleep(0.1)
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Beim Pollen eines Buttons überprüfst du ständig mit der Methode button.isPressed(),ob der Button gerade gedrückt ist oder mit button.wasPressed(), ob der Button seit dem letzten Aufruf dieser Methode gedrückt wurde.

Bei der Eventsteuerung definierst du in einer Callbackfunktion, wie auf ein Buttonklick zu reagieren ist. Die Callbackfunktion muss beim Erzeugen des Buttons registriert werden.

 

 

ZUM SELBST LÖSEN

 

 

1.a

Wenn du den rechten Button klickst, sollen LEDs in den zwei Spalten rechts leuchten. Beim Klick des linken Buttons sollen die zwei linken Spalten leuchten.
Verwende den Befehl rectangle(x, y, w, h, color), um die Streifen zu zeichnen.

 

 


1.b

Erstelle mit dem Oxoeditor zwei Bilder, die beim Klicken der bzw. linken Buttons erscheinen.

 

 

2.

Im oben gezeigten Beispiel reagiert das Programm auf Buttonklick und zeigt bei jedem Klick eine um 1 grössere Zahl an.
a) Löse die gleiche Aufgabe mit Pollen
b) Dein Programm soll zusätzlich beim Klicken des linken Buttons eine um 1 kleinere Zahl anzeigen. Löse das Problem mit Callbacks oder mit Pollen und verhindere, dass negative Zahlen oder Zahlen über 99 vorkommen.



3.

Die Schlange soll sich endlos auf dem äusseren Quadrat bewegen. Mit einem rechten Buttonklick willst du die Kopffarbe auf MAGENTA und die Schwanzfarbe auf CYAN und mit einem linken Buttonklick die Kopffarbe auf GREEN und die Schwanzfarbe auf YELLOW setzen.



4.

Programmiere ein einfaches Snake-Game: Die Schlange bewegt sich in einer endlosen while-Schleife schrittweise vorwärts. Du kannst mit einem Klick auf den rechten bzw. linken Buttonum  90° nach rechts bzw. nach links drehen. Das Spiel wird beendet, sobald die Schlange über den Rand hinausläuft. Nach jeweils 5 s wird die Geschwindigkeit der Schlange vergrössert. Ziel ist es, eine möglichst hohe Geschwindigkeit zu erreichen. Zeige die erreichte Geschwindigkeit am Ende des Spiels auf dem Display dar.

 



 

12-1
Fachliche Hinweise:

Die Buttons sind an folgenden Pins angeschlossen:

 BUTTON_L1  Pin(0)
 BUTTON_L2  Pin(32)
 BUTTON_L3  Pin(33)
 BUTTON_R1  Pin(14)
 BUTTON_R2  Pin(13)
 BUTTON_R3  Pin(27)