Beschreibung von Ereignissen
Ein Demo-Programm
Das folgende Demo-Programm soll verdeutlichen, dass eine grafische Benutzeroberfläche auf zahlreiche Ereignisse reagieren kann.
from tkinter import *
# Ereignisbehandlung
def linksVerschieben(event):
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
if x0 >= 10:
canvas.coords(id_kreis, (x0-10, y0, x1-10, y1))
def rechtsVerschieben(event):
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
if x1 <= 580:
canvas.coords(id_kreis, (x0+10, y0, x1+10, y1))
def obenVerschieben(event):
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
if y0 >= 10:
canvas.coords(id_kreis, (x0, y0-10, x1, y1-10))
def untenVerschieben(event):
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
if y1 <= 380:
canvas.coords(id_kreis, (x0, y0+10, x1, y1+10))
def objektLoeschen(event):
canvas.delete(id_kreis)
def vergroessern(event):
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
canvas.coords(id_kreis, (x0, y0, x1+10, y1+10))
def verkleinern(event):
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
if x1-x0 > 10 and y1-y0 > 10:
canvas.coords(id_kreis, (x0, y0, x1-10, y1-10))
def plazieren(event):
(x, y) = (event.x, event.y)
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
canvas.coords(id_kreis, (x, y, x+(x1-x0), y+(y1-y0)))
def entfernen(event):
(x, y) = (event.x, event.y)
(x0, y0, x1, y1) = tuple(canvas.coords(id_kreis))
if x0 <= x and x <= x1 and y0 <= y and y <= y1:
canvas.delete(id_kreis)
# Erzeugung der Komponenten
tkFenster = Tk()
tkFenster.title('Demo - Ereignisse')
tkFenster.geometry('400x300')
# Leinwand zum Zeichnen
canvas = Canvas(master=tkFenster, background='white')
canvas.place(x=10, y=10, width=380, height=280)
# Grafikobjekte
id_kreis = canvas.create_oval(100, 100, 120, 120, fill='red')
# Ereignisse
tkFenster.bind('<KeyPress-g>', vergroessern)
tkFenster.bind('<KeyPress-k>', verkleinern)
tkFenster.bind('<KeyPress-Up>', obenVerschieben)
tkFenster.bind('<KeyPress-Down>', untenVerschieben)
tkFenster.bind('<KeyPress-Left>', linksVerschieben)
tkFenster.bind('<KeyPress-Right>', rechtsVerschieben)
canvas.bind('<Button-1>', plazieren)
canvas.bind('<Button-3>', entfernen)
# Aktivierung der Ereignisschleife
tkFenster.mainloop()
Wenn man es ausführt, dann erscheint ein roter Kreis auf einer Leinwand.
Aufgabe 1
Starte das gezeigte Programm und löse mit den folgenden Aktionen Ereignisse aus. Beobachte, wie sich die GUI verhält. Versuche, das Verhalten anhand des Quelltextes zu erklären.
- Drücke die Pfeiltasten [→], [←], [↑], [↓].
- Drücke die Tasten [g] bzw. [k].
- Klicke mit der linken Maustaste auf eine beliebige Stelle innerhalb / außerhalb der Leinwand.
- Klicke mit der rechten Maustaste auf eine beliebige Stelle der Leinwand / auf den roten Kreis.
Event-Sequenzen
Ereignisse werden in tkinter
mit Hilfe sog. Event-Sequenzen beschrieben.
Das sind Zeichenketten, die für bestimmte Ereignisse stehen. Die folgende Übersicht zeigt
einige dieser vordefinierten Zeichenketten.
Event-Sequenz | Ereignis |
---|---|
'<Button-1>' | die linke Maustaste wird angeklickt |
'<Button-3>' | die rechte Maustaste wird angeklickt |
'<Double-Button-1>' | die linke Maustaste wird doppelt angeklickt |
'<ButtonRelease-1>' | die linke Maustaste loslassen |
'<Enter>' | der Mauszeiger wird auf eine GUI-Komponente bewegt |
'<Leave>' | der Mauszeiger verlässt eine GUI-Komponente |
'<Motion>' | der Mauszeiger wird innerhalb einer GUI-Komponente bewegt |
'<KeyPress-A>' | die A-Taste wird gedrückt |
'<KeyPress-Left>' | die Pfeil-nach-links-Taste wird gedrückt |
'<KeyRelease-Bt>' | die B-Taste wird losgelassen |
Beachte, dass Tastaturereignisse an das Anwendungsfenster gebunden werden. Mausereignisse werden in der Regel an die betreffenden GUI-Komponenten angebunden.
Aufgabe 2
Entwickle ein eigenes Programm zur Ereignisverarbeitung.