Maus-Events


Mit Maus-Events können mausgesteuerte Aktionen ausgelöst werden. Die Mausklicks bzw. Mausbewegungen werden vom System erfasst und führen zum Aufruf von Callbackfunktionen. Im TigerJython liefern die Callbackfunktionen die Koordinaten des Mausklicks bzw. die aktuelle Koordinate des Mauszeigers. Sie werden als benannte Parameter von makeTurtle() registriert.

Beispiel 1: Per Mausklick Farbmuster zeichnen.
Mit Hilfe zweier for-Schleifen wird zuerst eine Figur gezeichnet, die mehrere geschlossene Flächen enthält. Diese können per Mausklick gefüllt werden. Die Callbackfunktion onMousePressed(x, y) erhält die Koordinaten des Mausklicks und füllt mit dem Befehl fill(x, y) die geschlossene Fläche, in der sich der Punkt (x ,y) befindet.

# Tu12.py

from gturtle import *

def onMousePressed(x, y):
   fill(x, y)   
    
makeTurtle(mousePressed = onMousePressed)
hideTurtle()  
for k in range(12):
   for i in range(6):
      forward(80)
      right(60)
   left(30)
addStatusBar(20)
setStatusText('Click to fill some parts!')     
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

makeTurtle(mousePressed = onMousePressed): registriert die Callbackfunktion onMousePressed

 

Beispiel 2: An der Position des Mausklicks wird ein Stern gezeichnet.
Das Zeichnen der Figur wird in der Callbackfunktion onMousePressed() definiert. Die Callbackfunktion wird in makeTurtle() dem Parameter mousePressed übergeben.

# Tu12a.py

from gturtle import *

def onMousePressed(x, y):
    setPos(x, y)
    for i in range(6):
        fd(30).bk(30).rt(60)

makeTurtle(mousePressed = onMousePressed)
hideTurtle()
addStatusBar(20)
setStatusText("click to paint!")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

makeTurtle(mousePressed = onMousePressed): registriert die Callbackfunktion onMousePressed, die beim Mausklick aufgerufen wird. Die Callbackfunktion liefert die aktuellen Koordinaten der Maus und zeichnet eine Sternfigur. Das Zeichnen erfolgt mit versteckten Turtle. Lässt man die Zeile hideTurtle() weg, dauert es jeweils eine Weile, bis die nächste Sternfigur erscheint.

 

Beispiel 3: In diesem Beispiel möchte man die Turtle beim Zeichnen sehen (animierte Grafik). Dazu verwendet man anstelle des Parameters mousePressed den Parameter mouseHit oder mouseHitX. Diese sind so implementiert, dass sie in eigenen Threads laufen und dadurch die animierte Grafik ermöglichen. Auch unter Verwendung von mouseHit läuft dieses Beispiel nicht optimal. Wenn man bereits wieder klickt, während die Turtle noch am Zeichnen eines Sternes ist, so zeichnet sie diesen nicht fertig, sondern beginnt mit Zeichnen eines neuen Sternes. In dieser Situation eignet sich der Parameter mouseHitX am besten. Der nächste Mausklick wird erst dann registriert, wenn die Callbackfunktion vollständig ausgeführt wurde.

Mit aktivieren bzw. deaktivieren der Zeile makeTurtle() kann man die beiden Parameter mouseHit bzw. mouseHitX testen.

# Tu12b.py

from gturtle import *

def onMouseHit(x, y):
    setPos(x, y)
    for i in range(5):
        fd(50).rt(144)

makeTurtle(mouseHitX = onMouseHit)
#makeTurtle(mouseHit = onMouseHit)
speed(-1)
addStatusBar(20)
setStatusText("click to paint!")

Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

makeTurtle(mouseHitX = onMouseHit): registriert die Callbackfunktion onMouseHit() unter der Verwendung des Parameters mouseHitX . Der nächste Mausklick wird erst dann registriert, wenn die Callbackfunktion fertig gelaufen ist.



Für das Erfassen von Mausevents in makeTurtle() stehen folgende Parameter zur Verfügung.

  • mousePressed: Maustaste wird gedrückt
  • mouseReleased: Maustaste wird losgelassen
  • mouseClicked: Maustaste wird gedrückt und losgelassen
  • mouseDragged: Maus wird mit gedrückter Taste bewegt
  • mouseMoved: Maus wird bewegt
  • mouseHit: Maustaste wird gedrückt, Bewegung der Turtle sichtbar
  • mouseHitX: Maustaste wird gedrückt, blockiert die Registrierung weiteren Mausklicks bis die Callbackfunktion vollständig ausgeführt wurde
  • Mit isLeftMouseButton() bzw. isRightMouseButton() findet man heraus, welche Maustaste gedrückt wurde.

Die Bezeichnung der Callbackfunktionen kann frei gewählt werden.

 

Beispiel 4: Mit dem linken Mausklick werden die Felder eines Schachbretts rot gefärbt, mit rechtem Mausklick blau. Das Schachbrett muss zuerst gezeichnet werden. Die Callbackfunktion onMousePressed(x, y) gibt Koordinaten des Mausklicks zurück und prüft ob die linke oder rechte Maustaste gedrückt wurde.

#Tu12c.py

from gturtle import *

def onMousePressed(x, y):
    if isLeftMouseButton():
        setFillColor("red")
    if isRightMouseButton():    
        setFillColor("blue")
    fill(x, y)   

makeTurtle(mousePressed = onMousePressed)
hideTurtle()
setPenColor("black")
for x in range(-180, 150, 40): 
    setPos(x, -180)
    forward(320) 
right(90)
for y in range(-180, 150, 40): 
    setPos(-180, y)
    forward(320)
addStatusBar(20)
setStatusText('Click left or right to fill some fields!')
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

makeTurtle(mousePressed = onMousePressed): registriert die Callbackfunktion onMousePressed.
isLeftMouseButton: gibt True zurück, wenn die linke Maustaste gedrückt wurde
isRightMouseButton: gibt True zurück, wenn die rechte Maustaste gedrückt wurde

 

Beispiel 5: Freihandzeichnen mit gedrückter Maustaste.
Zur Erfassung der Mausbewegung wird die Callbackfunktion onMouseDragged(x, y) verwendetder, die mit dem Parameter mouseDragged registriert wird. Um die Turtle jeweils zu Beginn des Zeichnens an die Stelle des Mausklicks zu setzen, wird die Callbackfunktion onMousePressed(x, y) verwendet, die mit dem Parameter mousePressed registriert wird.

# Tu12d.py

from gturtle import *

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

def onMouseDragged(x, y):
    moveTo(x, y)

makeTurtle(mousePressed = onMousePressed,
           mouseDragged = onMouseDragged)
speed(-1)
setPenColor("red")
addStatusBar(20)
setStatusText("Drag turtle to paint!")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

onMouseDragged(x, y) :Callbackfunktion, die bei Mausbewegungen mit gedrückter Taste aufgerufen wird. Sie liefert die aktuellen Mauscursor-Koordinaten
makeTurtle(mousePressed = onMousePressed, mouseDragged = onMouseDragged): man kann mehrere Callbacks mit benannten Parametern registrieren.

 

Beispiel 6: Linke und rechte Maustaste.
Mit der linken Maustaste kann man eine beliebige Figur zeichnen, mit dem rechten Mausklick werden geschlossene Flächen gefüllt.

In der Callbackfunktion onMousePressed(x, y) wird überprüft, ob die linke oder rechte Maustaste gedrückt wurde. Der linker Mausklick setzt die Turtle zu Beginn an die Mausklick-Position. Mit rechtem Mausklick wird die Funktion fill(x, y) aufgerufen, die geschlossene Fläche in der sich der Mauszeiger befinden ausfüllt.

Zur Erfassung der Mausbewegung wird der Parameter mouseDragged mit der Callbackfunktion onMouseDragged verwendet.

# Tu12e.py

from gturtle import *

def onMousePressed(x, y):
    if isLeftMouseButton():
        setPos(x, y)

    if isRightMouseButton():
        fill(x, y)

def onMouseDragged(x, y): 
    moveTo(x, y)

makeTurtle(mousePressed = onMousePressed,
           mouseDragged = onMouseDragged)
hideTurtle()
addStatusBar(20)
setStatusText("Drag turtle to paint!")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

isLeftMouseButton() : Gibt True zurück, wenn die linke Maustaste gedrückt wurde
isRightMouseButton(): Gibt True zurück, wenn die rechte Maustaste gedrückt wurde

 

Beispiel 7: Mit Mausklicks mehrere Turtles erzeugen.
An der Position des Mausklicks wird eine neue Turtle erzeugt und diese zeichnet einen Stern. Es ist nötig, ein Turtleframe zu verwenden, damit sich alle Turtles im gleichen Fenster befinden.

# Tu12f.py

from gturtle import *

def onMouseHit(x, y):
    t = Turtle(tf)
    t.setPos(x, y)
    t.fillToPoint(x, y) 
    star(t)

def star(t):
    for i in range(6): 
        t.fd(20).rt(140).fd(20).lt(80)

tf = TurtleFrame(mouseHit = onMouseHit)
tf.addStatusBar(20)
tf.setStatusText("Click to create a new star")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

tf = TurtleFrame(mouseHit = onMouseHit) Die Callbackfunktion wird hier im TurtleFrame registriert.
t = Turtle(tf) der Turtle wird das TurtleFrame übergeben, damit alle Turtles im gleichen Fenster erscheinen

 

Beispiel 8: Maus- und Tastatur-Events kombiniieren
Beim Erzeugen der Turtle mit makeTurtle() können gleichzeitig Maus- und Tastatur-Events registriert werden. In diesem Beispiel wird beim Drücken der linken Maustaste ein blauer Punkt und beim Drücken der rechten Maustaste ein grüner Punkt an der Position des Mausklicks gezeichnet. Beim Drücken der Enter-Taste (Key = 10) wird der Punkt an der Position des letzten Mausklicks rot übermalt.

# Tu 12g.py

from gturtle import*

def onPressed(x,y):
    global mx, my 
    if isLeftMouseButton():
        setPenColor("blue")
    if isRightMouseButton():
        setPenColor("green")        
    setPos(x, y) 
    dot(20)               
    mx = x
    my = y    
    
def onKeyPressed(key):
    print(key)
    if key==10:#Enter
        setPos(mx,my)
        setPenColor("red")
        dot(20)
        
makeTurtle(mousePressed=onPressed,keyPressed=onKeyPressed)
hideTurtle()
mx = 0
my = 0 
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

makeTurtle(mousePressed=onPressed,keyPressed=onKeyPressed) registriert gleichzeitig Maus- und Key-Events
global mx, my: die Variablen mx und my werden auch in der Funktion onKeyPressed() verwendet
mx = 0, my = y: Variablen werden initialisiert für den Fall, dass zuerst die Enter-Taste und nicht ein Maustaste gedrückt wird.

 

 


Aufgaben Serie 12

1)

Zeichne per Mausklick Sternfiguren. Teste drei Varianten:
a) mit mousePressed und hideTurtle()
b) mit mouseHit und sichtbarer Turtle
c) mit sichtbarer Turtle unter Verwendung des Parameters mouseHitX

       
2)

Zeichne zuerst eine nicht ausgefüllte Sternfigur. Das Programm soll dann das Füllen der geschlossenen Flächen mit der Mausklick ermöglichen. Fülle dann einige Flächen und erstelle ein schönes Muster.

 

 
       
3)

Bei jedem Mausklick wird an dessen der Position eine neue Turtle erzeugt. Diese bewegt sich waagrecht. Wenn sie den Rand des Fensters erreicht, dreht sie sich um 180° und bewegt sich endlos hin und her.

 

 
       
4)

Mit dem linken Mausklick soll ein roter Punkt gezeichnet werden (dot(20)). Mit dem rechten Mausklick kann die Punkte wieder löschen.

Die einfachste Lösung ist, die Punkte mit der weissen Stiftfarbe zu übermalen.

 

 
       
5)

Mit dem linken Mausklick werden leere Kreise gezichnet (openDot(40)). Falls man nach einem Mausklick die Taste Enter drückt wird, wird der zuletztgezeichnete Kreis gefüllt.