Datenverwaltung mit globalen Variablen

Beispiel - Zähler

Wir betrachten noch einmal einen Zähler mit grafischer Benutzeroberfläche.

Anwendungsfenster

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.

Anwendungsfenster

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()
X

Fehler melden

X

Suche