Datenverwaltung mit globalen Variablen
Beispiel - Zähler
Wir betrachten noch einmal einen Zähler mit grafischer Benutzeroberfläche.
Die Verwaltung des Zählerstands kann auch mit Hilfe einer geeigneten Variablen erfolgen. Diese Variablen muss global definiert sein, damit ihr Wert in den betreffenden Ereignisbehandlungsprozeduren verändert werden kann.
# Datenmodell
stand = 0
# GUI - Ereignisbehandlung
def buttonWeiterClick():
global stand
stand = stand + 1
labelZahl.config(text=str(stand))
def buttonZurueckClick():
global stand
if stand > 0:
stand = stand - 1
labelZahl.config(text=str(stand))
def buttonNullClick():
global stand
stand = 0
labelZahl.config(text=str(stand))
# GUI - Komponenten
from tkinter import *
# Fenster
tkFenster = Tk()
tkFenster.title('Zähler')
tkFenster.geometry('170x125')
# Label
labelZahl = Label(master=tkFenster, text=str(stand), bg='gray', font=('Arial', 36))
labelZahl.place(x=5, y=5, width=160, height=80)
# Button
buttonWeiter = Button(master=tkFenster, text='weiter', bg='#D5E88F', command=buttonWeiterClick)
buttonWeiter.place(x=115, y=90, width=50, height=30)
buttonZurueck = Button(master=tkFenster, text='zurück', bg='#FFCFC9', command=buttonZurueckClick)
buttonZurueck.place(x=5, y=90, width=50, height=30)
buttonNull = Button(master=tkFenster, text='Null', bg='#FBD975', command=buttonNullClick)
buttonNull.place(x=60, y=90, width=50, height=30)
# Aktivierung des Fensters
tkFenster.mainloop()
Das Programm zeigt, dass man das Datenverwaltungsproblem mit globalen Variablen lösen kann. Die Verwendung globaler Variablen wird jedoch in der Regel vermieden, da sie Programme schwer durchschaubar macht. Statt globaler Variablen verwendet man besser eigenständige Objekte zur Verwaltung der Anwendungsdaten. Wir stellen diesen Ansatz im nächsten Abschnitt kurz vor.
Aufgabe 1
(a) Vergleiche dieses Programm mit dem Programm aus dem letzten Abschnitt. Warum gibt es im Programm oben eine klare Trennung der Zuständigkeiten "Verwaltung der Anwendungsdaten" und "Darstellung der Anwendungsdaten auf der GUI"?
(b) Warum funktioniert das Programm oben nicht mehr korrekt, wenn man die Anweisung
global stand weglässt? Probiere es einmal aus.
Aufgabe 2
Entwickle eine GUI zur Anmeldung mit einem Passwort.
Der Benutzer kann mit den Schaltflächen die Buchstaben A, B und C eingeben. Wenn er/sie die Buchstabenkombination bestehend aus drei Buchstaben richtig eingegeben hat, dann erhält er/sie eine positive, ansonsten eine negative Rückmeldung.
Hier ein Programmgerüst mit einem Datenmodell bestehend aus globalen Variablen:
# Datenmodell
passwort = 'BAB'
eingabe = ''
zaehlerEingabe = 0
rueckmeldung = 'Gib das Passwort *** ein.'
# GUI - Ereignisbehandlung
def buttonAClick():
pass
def buttonBClick():
pass
def buttonCClick():
pass
def buttonNochmalClick():
pass
# GUI - Komponenten
from tkinter import *
# Erzeugung des Fensters
tkFenster = Tk()
tkFenster.title('Anmeldung')
tkFenster.geometry('210x140')
# Rahmen
frameEingabe = Frame(master=tkFenster, bg='#FFCFC9')
frameEingabe.place(x=5, y=5, width=200, height=40)
frameRueckmeldung = Frame(master=tkFenster, bg='#FBD975')
frameRueckmeldung.place(x=5, y=50, width=200, height=40)
frameNochmal = Frame(master=tkFenster, bg='#D5E88F')
frameNochmal.place(x=5, y=95, width=200, height=40)
# Eingaben
buttonA = Button(master=frameEingabe, text='A', command=buttonAClick)
buttonA.place(x=5, y=5, width=30, height=30)
buttonB = Button(master=frameEingabe, text='B', command=buttonBClick)
buttonB.place(x=40, y=5, width=30, height=30)
buttonC = Button(master=frameEingabe, text='C', command=buttonCClick)
buttonC.place(x=75, y=5, width=30, height=30)
labelAnzeige = Label(master=frameEingabe, text='')
labelAnzeige.place(x=165, y=5, width=30, height=30)
# Rückmeldung
labelRueckmeldung = Label(master=frameRueckmeldung, text=rueckmeldung)
labelRueckmeldung.place(x=5, y=5, width=190, height=30)
# Nochmal
buttonNochmal = Button(master=frameNochmal, text='nochmal', command=buttonNochmalClick)
buttonNochmal.place(x=65, y=5, width=70, height=30)
# Aktivierung des Fensters
tkFenster.mainloop()