Behandlung von Ereignissen
Zugriff auf Attribute von Ereignissen
Bei der Behandlung von Ereignissen kann man auf Attribute eines Ereignisses zugreifen. Dies wurde bereits im Programm des letzten Abschnitts ausgenutzt.
Mit event.x
bzw. event.y
kann man die Koordinaten des Mauszeigers (bezogen auf die linke obere Ecke der angeklickten GUI-Komponente) zugreifen.
Weitere Zugriffsmöglichkeiten zeigt die folgende Übersicht.
Attribut | Bedeutung |
---|
x, y | Koordinaten des Mauszeigers (bezogen auf die linke obere Ecke der angeklickten GUI-Komponente) |
char | Zeichen bei einem Tastatur-Ereignis |
num | Nummer der gedrückten Taste bei einem Mausklick-Ereignis |
widget | Referenz auf die GUI-Komponente, durch die das Ereignis ausgelöst wurde |
time | Zeitwert in Millisekunden zur Bestimmung der Zeitspanne zwischen zwei Ereignissen |
Anwendung - Vermeidung von Codepuplizierung
Im Abschnitt Der place-Manager wurde ein einfacher Rechner mit grafischer Benutzeroberfläche vorgestellt
Hier ein Auszug aus dem Quelltext. Den vollständigen Quelltext kannst du hier herunterladen.
Es fällt auf, dass die Ereignisbehandlungsprozeduren völlig analog aufgebaut sind und dass folglich Programmcode in ähnlicher Form mehrfach auftritt. Man spricht in einem solchen Fall von Codeduplizierung. Codeduplizierung lässt sich in der Regel vermeiden. Wie das im vorliegenden Fall möglich ist, zeigt das folgende Programm.
from tkinter import *
def rechnen(event):
zahl1 = int(entryZahl1.get())
zahl2 = int(entryZahl2.get())
rechenzeichen = event.widget.cget('text')
if rechenzeichen == '+':
ergebnis = zahl1 + zahl2
elif rechenzeichen == '-':
ergebnis = zahl1 - zahl2
elif rechenzeichen == '*':
ergebnis = zahl1 * zahl2
elif rechenzeichen == ':':
ergebnis = zahl1 // zahl2
elif rechenzeichen == '%':
ergebnis = zahl1 % zahl2
labelErgebnis.config(text=str(ergebnis))
tkFenster = Tk()
tkFenster.title('Rechner')
tkFenster.geometry('200x180')
frameZahl1 = Frame(master=tkFenster, bg='#FFCFC9')
frameZahl1.place(x=5, y=5, width=80, height=60)
frameZahl2 = Frame(master=tkFenster, bg='#FFCFC9')
frameZahl2.place(x=115, y=5, width=80, height=60)
frameBerechnen = Frame(master=tkFenster, bg='#FBD975')
frameBerechnen.place(x=0, y=70, width=200, height=40)
frameErgebnis = Frame(master=tkFenster, bg='#D5E88F')
frameErgebnis.place(x=60, y=115, width=80, height=60)
labelZahl1 = Label(master=frameZahl1, bg='white', text='Zahl 1')
labelZahl1.place(x=5, y=5, width=70, height=20)
entryZahl1 = Entry(master=frameZahl1, bg='white')
entryZahl1.place(x=5, y=35, width=70, height=20)
labelZahl2 = Label(master=frameZahl2, bg='white', text='Zahl 2')
labelZahl2.place(x=5, y=5, width=70, height=20)
entryZahl2 = Entry(master=frameZahl2, bg='white', width='8')
entryZahl2.place(x=5, y=35, width=70, height=20)
buttonPlus = Button(master=frameBerechnen, text='+', width='2')
buttonPlus.bind('<Button-1>', rechnen)
buttonPlus.place(x=5, y=5, width=30, height=30)
buttonMinus = Button(master=frameBerechnen, text='-', width='2')
buttonMinus.bind('<Button-1>', rechnen)
buttonMinus.place(x=45, y=5, width=30, height=30)
buttonMal = Button(master=frameBerechnen, text='*', width='2')
buttonMal.bind('<Button-1>', rechnen)
buttonMal.place(x=85, y=5, width=30, height=30)
buttonDurch = Button(master=frameBerechnen, text=':', width='2')
buttonDurch.bind('<Button-1>', rechnen)
buttonDurch.place(x=125, y=5, width=30, height=30)
buttonRest = Button(master=frameBerechnen, text='%', width='2')
buttonRest.bind('<Button-1>', rechnen)
buttonRest.place(x=165, y=5, width=30, height=30)
labelAufschriftErgebnis = Label(master=frameErgebnis, bg='white', text='Ergebnis')
labelAufschriftErgebnis.place(x=5, y=5, width=70, height=20)
labelErgebnis = Label(master=frameErgebnis, bg='white', width='8', text='')
labelErgebnis.place(x=5, y=35, width=70, height=20)
tkFenster.mainloop()
Aufgabe 1
Erkläre, wie die Codeduplizierung hier vermieden wird.