EINFÜHRUNG |
Bisher bestand ein Programm aus einem einzigen Ablaufstrang, in dem eine Anweisung um die andere mit möglichen Verzweigungen und Wiederholungen ausgeführt wird. Klickst du eine Maustaste, so weisst du aber nicht, wo sich dein Programm eben gerade befindet. Um das Klicken im Programm zu erfassen, muss daher ein neues Programmierkonzept verwendet werden, die Ereignissteuerung. Hier das Prinzip: Du definierst eine Funktion mit irgendeinem Namen, z.B. onMouseHit(), die im Programm nirgends explizit aufgerufen wird. Nun verlangst du vom Computer, dass er diese Funktion aufrufen soll, wenn die Maustaste geklickt wird. Du sagst also im Programm: Wann immer die Maus geklickt wird, führe onMouseHit() aus. |
MAUSEVENTS |
Das neue Konzept ist in Python sehr einfach umzusetzen. Im ersten ereignisgesteuerten Programm soll im Hauptteil die Turtle zuerst eine lustige Figur zeichnen. Nachher willst du diese noch verschönern, indem du bestimmte Bereiche mit einem Mausklick einfärbst. Du schreibst dazu die Funktion onMouseHit(x, y), die dir die x- und y-Koordinate des Mausklicks liefert, und führst darin mit fill(x, y) ein Floodfill (Füllen eines geschlossenen Bereichs) aus.
from gturtle import * def onMouseHit(x, y): fill(x, y) makeTurtle(mouseHit = onMouseHit) hideTurtle() addStatusBar(30) setStatusText("Click to fill a region!") repeat 12: repeat 6: forward(80) right(60) left(30)
|
MEMO |
Programmtechnisch wird das Konzept der ereignisgesteuerten Programmierung bei unserer Turtle so umgesetzt, dass du eine Funktion schreibst, die beim Auftreten des Ereignisses aufgerufen werden soll. Du teilst dies dem System mit, indem du diesen Funktionsnamen als Parameter von makeTurtle() übergibst. Dabei verwendest du die Schreibweise parameter_name = parameter_wert. Du kannst die Füllfarbe mit setFillColor() deinen Wünschen anpassen. Wichtige Informationen für den Benutzer kannst du in einer Statuszeile ausschreiben, die mit addStatusBar(n) unten am Turtlefenster erscheint. Die Zahl n gibt die Höhe dieser Textzeile an (in Pixel). |
ZEICHNEN PER MAUSKLICK |
from gturtle import * def onMouseHit(x, y): setPos(x, y) repeat 6: dot(40) forward(60) back(60) right(60) makeTurtle(mouseHit = onMouseHit) speed(-1) |
MEMO |
Das Programm hat einen Schönheitsfehler: Wenn du bereits wieder klickst, während die Turtle noch am Zeichnen eines Sterns ist, so zeichnet sie diesen Stern nicht fertig, sondern beginnt mit dem Zeichnen des neuen Sterns. Dabei führt sie aber die Befehle des alten Sterns auch noch weiter, wodurch der neue Stern falsch gezeichnet wird. Dieses Falschverhalten ist offenbar darauf zurück zu führen, dass bei jedem Klick die Funktion onMouseHit() aufgerufen und ausgeführt wird, auch wenn die vorhergehende Ausführung noch nicht beendet ist. Um dies zu verhindern, verwendest du an Stelle des Parameters mit dem Namen mouseHit den Parameter mit dem Namen mouseHitX. |
TURTLE VERFOLGT MAUS |
from gturtle import * def onMouseMoved(x, y): setHeading(towards(x, y)) forward(10) makeTurtle(mouseMoved = onMouseMoved) speed(-1) |
MEMO |
Neben mouseHit und mouseHitX stehen dir für das Erfassen von Mausevents in makeTurtle() weitere Parameter zur Verfügung.
Du kannst auch mehrere Parameter gleichzeitig verwenden, also beispielsweise die zwei Funktionen onMousePressed() sowie onMouseDragged() angeben: makeTurtle(mousePressed = onMousePressed, mouseDragged = onMouseDragged)Mit isLeftMouseButton() bzw. isRightMouseButton() findest du heraus, welche Maustaste gedrückt wurde. Es gibt bei diesen Events einen wichtigen Unterschied zu mouseHit: Die Bewegung der Turtle ist während der Ausführung der Funktion nicht sichtbar. Du solltest also entweder die Turtle mit speed(-1) auf hohe Geschwindigkeit setzen oder mit hideTurtle() verstecken. |
from gturtle import * def onMousePressed(x, y): moveTo(x, y) makeTurtle(mousePressed = onMousePressed) #speed(-1) #hideTurtle() |
TASTATUREVENTS |
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() while True: forward(10) |
AUFGABEN |
|
ZUSATZSTOFF |
DEIN PERSÖNLICHES MAUSBILD |
Das oben gezeigte Verfolgungsprogramm kannst du jetzt mit cuteturtle oder deiner eigenen Mausfigur verschönern, wobei du auch mit moveTo() dafür sorgst, dass die Turtle sich immer bis zur Maus bewegt. from gturtle import * def onMouseMoved(x, y): moveTo(x, y) makeTurtle(mouseMoved = onMouseMoved) setCustomCursor("sprites/cutemouse.gif") speed(-1) |
MEMO |
Mit speed(-1) unterbindest du die Animation der Turtle, wodurch das Zeichnen mit moveTo() schneller erfolgt. Mögliche Parameter von setCursor():
Das Verzeichnis sprites in der Pfadangabe von setCustomCursor() ist im Verzeichnis, in dem sich dein Programm befindet
[mehr...
Es kann sich auch um ein Unterverzeichnis im Verzeichnis gamegrid im UserHome handeln. |