1.3 Callback-Funktionen

Im Unterschied zu den bisherigen Programmen setzt sich das folgende Programm und alle weiteren Programme im meistens aus zwei Teilen zusammen.

  • Einer grafischen Benutzeroberfläche mit dem Hauptfenster.
  • Einer Funktion oder mehrerer Funktionen.
Definition
Begriff »Callback-Funktion«

Eine Callback-Funktion ist eine spezielle Python-Funktion[1], die auf das Ereignis eines Mausklicks auf das Button-Widget reagiert, sodass durch die Anweisung »command« die Funktion aufgerufen und ausführt wird.

Programm »funktion.py«

Das Programm »funktion.py«:

  • erzeugt eine grafische Benutzeroberfläche – das Hauptfenster auf dem ein Label-Widget und zwei Button-Widgets platziert sind
  • enthält die Callback-Funktion »buttonClick«

In den Abbildungen 1 und 2 ist zu sehen, was das Programm »funktion.py« vor und nach dem Mausklick auf den Button »Funktion aufrufen« ausgibt.

Bild 23 Bild 24
Abbildung 1 und 2: Hauptfenster vor und nach dem Button-Klick »Funktion aufrufen«
  • Auf dem Hauptfenster sind ein Label-Widgets und zwei Button-Widgets untereinander platziert.
  • Das Button-Widget mit dem Schriftzug »Funktion aufrufen« dient dem Aufruf der im Programm definierten Callback-Funktion »buttomClick«.
  • Das andere Button-Widget mit dem Schriftzug »Programm beenden« dient dem Beenden des Programms.
  • Beide Buttons reagieren auf Mausklicks.
Quelltext des Programms »funktion.py«
import tkinter as tk

# Callback-Funktion
def buttonClick():
    label.config(\
        text="Die Callback-Funktion wurde ausgeführt.")
    button1.config(state=tk.DISABLED)

# grafische Benutzeroberfläche
root=tk.Tk()
root.title("Callback-Funktion")
root.geometry("400x200")
root.resizable(False, False)

# Widgets
label=tk.Label(root,\
		text="Mit der Maus auf den Button klicken!")
button1=tk.Button(root, text="Funktion aufrufen",\
                 command=buttonClick)
button2 = tk.Button(root, text="Programm beenden",\
                    command=root.destroy)

label.pack(pady=30)
button1.pack(pady=10)
button2.pack(pady=10)

root.mainloop()

Erklärungen zum Quelltext
3., 9. und 15. Zeile In den Zeilen stehen Kommentare zum Verstehen des Quelltexts.
4. bis 7. Zeile Die Callback-Funktion »buttonClick« wird deklariert.
5. und 6. Zeile Auf dem Hauptfenster der Benutzeroberfläche wird der Text »Die Callback-Funktion wurde ausgeführt.« auf das Label-Widget geschrieben.
  • Der anfängliche Text »Mit der Maus auf den Button klicken!« auf dem Label wird überschrieben.
7. Zeile Das Button-Widget mit der Aufschrift »Funktion aufrufen« wird deaktiviert.
  • Danach erfolgt der Rücksprung aus der Callback-Funktion zur rufenden Stelle in den Zeilen 18 und 19.
11. Zeile Das Hauptfenster erhält den Titel »Callback-Funktion«.
12. Zeile Das Hauptfenster der grafischen Benutzeroberfläche erhält die Größe 400x150 Pixel.
  • Die Breite des Hauptfensters beträgt 400 Pixel.
  • Die Höhe des Hauptfensters beträgt 150 Pixel.
16. und 17. Zeile Das Label-Widget mit der Aufschrift »Mit der Maus auf den Button klicken!« wird erzeugt.
18. und 19. Zeile Das Button-Widget mit der Aufschrift »Funktion aufrufen!« wird erzeugt.
12. und 21. Zeile Das Button-Widget mit der Aufschrift »Programm beenden« wird erzeugt.
23. bis 25. Zeile Das Label-Widget und die Button-Widgets werden als Elemente auf dem Hauptfenster platziert.
Übung

Aufgabe A8

Übertrage den Programm-Quelltext auf den Computer.

Führe das Programm am Computer aus.

Programm »frage.py«

Das Programm:

  • erzeugt eine grafische Benutzeroberfläche – das Hauptfenster auf dem zwei Label-Widgets, ein Entry-Widgets und zwei Button-Widgets platziert sind
    Bild 129 Bild 130
    Abbildung 3 und 4: Hauptfenster vor und nach dem Button-Klick »Eine Frage?«
  • enthält die Callback-Funktion »frage«
Quelltext des Programms »frage.py«
 import tkinter as tk

# Callback-Funktion
def frage():
    vorname=entry.get()
    if vorname!="":
        label2.config(\
            text=f"{vorname}, möchtest du programmieren?")
        button1.config(state=tk.DISABLED)
    
# grafische Benutzeroberfläche    
root=tk.Tk()
root.title("Frage")
root.geometry("400x300")
root.resizable(False, False)

# Widgets
label1=tk.Label(root,\
                text = "Gib bitte deinen Vornamen ein:")
entry=tk.Entry(root, width=10)
button1=tk.Button(root, text="Eine Frage?", command=frage)
label2=tk.Label(root)
button2=tk.Button(root, text="Programm Beenden",\
                  command=root.destroy)

label1.pack(pady=30)
entry.pack(pady=10)
button1.pack(pady=10)
label2.pack(pady=10)
button2.pack(pady=10)

root.mainloop()

 
Erklärungen zum Quelltext
4. bis 9. Zeile Die Callback-Funktion »frage« wird deklariert.
5. Zeile Im Entry-Widgets erfolgt die Benutzereingaben des Wertes für die Variable »vorname«.
6. bis 9. Zeile Die if-Anweisung ist eine einfache Auswahl mit einem Bedingungszweig.
  • Ist der Wert der Variable »vorname« ungleich (!=) der leeren Zeichenkette (String), wird der Wert der Variable in einem f-String verknüpft mit der Zeichenkette
    », möchtest du programmieren?« ausgegeben.
9. Zeile Das Button-Widget mit der Aufschrift »Eine Frage?« wird deaktiviert.
  • Danach erfolgt der Rücksprung aus der Callback-Funktion zur rufenden Stelle in der Zeilen 21.
Übung

Aufgabe A9

Implementiere das Programm-Quelltext am Computer.

Führe das Programm aus und teste, ob es fehlerfrei läuft und den gestellten Anforderungen entspricht.


  1. [1] Im Abschnitt 3.4 erfolgt weiteres zum Thema Funktionen.