i

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

Suche

v
5.1.6.2
inf-schule.de/software/gui/guidatenmodell/globalevariablen

Rückmeldung geben