Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

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.

Anwendungsfenster

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.

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.

X

Fehler melden

X

Suche