Python - Online
HomeTurtlegrafikGPanelRobotikDatenbanken
ereignisse

11. MAUSEVENTS

 

 

DU LERNST HIER...

 

dass die ereignisgesteuerte Programmierung ein neues Programmierkonzept ist. Statt dass du mit deinem Programm der Turtle Befehle erteilst, kannst du die Turtle mit Mausklicks steuern.

 

 

MUSTERBEISPIELE

 

Mit Mausevents werden mausgesteuerte Aktionen ausgelöst. Die Mausklicks werden vom System erfasst und führen zum Aufruf einer sogenannten Callbackfunktion. Diese gibt die Koordinaten des Mausklicks zurück und legt fest, was bei einem Mausklick geschehen soll. Die Callbackfunktion wird als benannter Parameter von makeTurtle() registriert.

In deinem Beispiel bewegt sich die Turtle bei jedem Mausklick an die Position des Mausklicks und zeichnet dort einen Punkt. In der Callbackfunktion onMousePressed(x, y) legst du dieses Verhalten fest. Die Callbackfunktion gibt ausserdem die Koordinaten des Mausklicks zurück.

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

 

Programm:

from gturtle import *

def onMousePressed(x, y):
    moveTo(x, y)
    dot(20)

makeTurtle(mousePressed = onMousePressed)
hideTurtle()
setPenColor("blue")
dot(20)
► In Zwischenablage kopieren
 

 

Im zweiten Beispiel wird bei jedem Mausklick ein Stern gezeichnet. Dazu definierst du zuerst eine Funktion drawStar(), die einen solchen Stern zeichnet. In der Callbackfunktion onMousePressed(x, y) legst du fest, was die Turtle beim Drücken einer Maustaste tun soll. Hier ruft sie an der Position des Mausklicks deine Funktion drawStar(), die einen Stern zeichnet.

Die Callbackfunktion wird als Parameter von makeTurtle() registriert. So teilst du dem System mit, dass es diese Funktion bei jedem Mausklick aufrufen soll. Dabei werden ihr die Koordinaten x, y des Mausklicks zurückgegeben.

 

Programm:

from gturtle import *

def drawStar():
    repeat 9:
        forward(40)
        right(160)

def onMousePressed(x, y):
    setPos(x, y)
    drawStar()

makeTurtle(mousePressed = onMousePressed)
hideTurtle()
setPenColor("magenta")
► In Zwischenablage kopieren
 

 

Hier wird mit Mausklicks ein gefülltes n-Eck gezeichnet. Dazu definierst du eine Callbackfunktion drawPoint(x, y) , welche die aktuelle Mausposition mit der Position des Mausklicks verbindet und dort einen Punkt zeichnet. Die Anzahl der Ecken kannst du mit einem Input-Dialog eingeben. Wenn der letzte Mausklick mit dem Anfangspunkt übereinstimmt, wird das n-Eck mit dem Befehl fillPath() rot gefüllt (Sonst wird der letzte Punkt mit dem Anfangspunkt (0, 0) verbunden).

Die Anzahl bereits gezeichneten Punkte wird in der Variablen n festgehalten. Diese wird bei jedem Mausklick um 1 vergrössert. Da die Variable n sowohl im Hauptprogramm als in der Funktion drawPoint() verwendet wird, muss sie als a global definiert werden.

 

Programm:

from gturtle import *

def drawPoint(x, y):
    global n
    moveTo(x, y)
    dot(5)
    n += 1
    if n == nbCorners:
        fillPath()

makeTurtle(mousePressed = drawPoint)
hideTurtle()
n = 0
nbCorners = InputInt("GibAnzahl Ecken an")
setFillColor("red")
startPath()
► In Zwischenablage kopieren

 

 

 

MERKE DIR...

 

Die neue Programmiertechnik ist daran zu erkennen, dass die Funktion onMousePressed(x, y) nirgends von deinem Programm aufgerufen wird. Sie wird beim Auftreten eines Ereignisses vom System aufgerufen. Eine solche Funktion nennen wir Callbackfunktion oder kurz Callback.

Die Variable n im letzten Beispiel nennt man eine globale Variable, da sie sowohl im Hauptprogramm als in der Callbackfunktion drawPoint(x,y) verwendet wird. Eine Variable die nur in einer Funktion verwendet wird, nennt man eine lokale Variable.

 

 

ZUM SELBST LÖSEN

 

1.

Bei jedem Mausklick soll ein gefüllter Kreis (dot) gezeichnet werden. Die Füllfarben und Durchmesser des Kreises werden zufällig gewählt. Wie man zufällige Farben erzeugen kann siehst du im zweiten Musterbeispiel im Kapitel Zufallszahlen.
 

2.
Auf dunkelblauen Hintergrund wird bei jedem Mausklick ein gelb gefüllter Stern gezeichnet. Den blauen Hintergrund zeichnest du mit dem Befehl clear("darkblue").  

3.

Die Sterne werden wie in der vorhergehenden Aufgabe an den Positionen der Mausklicks gezeichnet. Die Füllfarbe der Sterne wechselt zwischen rot und blau.
(Nach dem du einen roten Sterngezeichnet hast, muss du die Farbe auf rot setzen und umgekehrt).

 

 

 

 

ZUSATZSTOFF

 

DEIN ERSTES GAME

 

Tic-Tac-Toe ist ein bekanntes Spiel, bei dem zwei Spieler abwechslungsweise Kreuze oder Kringel in die Felder eines 3x3-Gitters setzen mit dem Ziel, als erster drei eigene Zeichen in einer horizontalen, vertikalen Linie oder einer der Diagonalen zu haben.

 

Hier zeichnest du statt Kreuze und Kreise je nach Spieler einen roten oder grünen Punkt.

Zuerst definierst du die Funktion drawBoard(), die das 3x3-Gitter zeichnet. Um die Farbe umzuschalten, führst du eine Variable player ein, die den Spieler identifiziert (Werte 1 oder 2 annimmt). Diese musst du in der Callbackfunktion drawDot(x, y) als global bezeichnen, da sie im Hauptprogramm initialisiert wird und in der Funktion drawDot() nach jedem Mausklick zwischen den beiden Werten 1 und 2 wechselt.

 


Programm:
from gturtle import *

def square():
    for i in range(4):
        forward(60)
        right(90)

def drawBoard():
    for x in range(3):
        for y in range(3):
            setPos(60 * x, 60 * y)
            square()

def drawDot(x, y):
    global player
    if player == 1:
        setPenColor("red")
        player = 2
    elif player == 2:
        setPenColor("lime")
        player = 1
    setPos(x, y)
    dot(45)

player = 1        
makeTurtle(mousePressed = drawDot)
hideTurtle()
drawBoard()
► In Zwischenablage kopieren

Es wäre interessant, das Spiel so zu erweitern, dass es von selbst merkt, wenn der ein Spieler gewonnen hat bzw. wenn das Spiel unentschieden ist.

 

 

ZUM SELBST LÖSEN

 
4*.


Erstelle ein Nim-Spiel mit 15 roten Steinen. Jeder Spieler kann mit einem Mausklick maximal 3 Steine entfernen und muss dann auf die grüne Schaltfläche, sozusagen den OK-Button,  klicken. Dann kommt der andere Spieler zum Zug. Wer den letzten Stein entfernt, hat verloren. Um zu erkennen, ob ein Spieler den roten Stein oder den grünen Button mit der Maus geklickt hat, verwendest du den Befehl getPixelColorStr(). Dieser gibt die Hintergrundfarbe zurück (z.B. "red" , "green"). Die Steine lässt du verschwinden, indem du sie weiss übermalst. Das Spiel wird üblicherweise mit Zündhölzern gespielt.