Datenverwaltung mit Datenmodellobjekte
Beispiel - Zähler
Wir betrachten noch einmal einen Zähler mit grafischer Benutzeroberfläche.
Ziel ist es, die Zählerdaten mit einem eigenständigen Objekt zu verwalten. Mehr über diesen objektorientierten Ansatz erfährst du im Kapitel Objektorientierte Programmierung mit Python.
Ein Bauplan für Zähler-Objekte
Zunächst muss man einen Bauplan (eine Klasse) für ein Zähler-Objekt entwickeln.
class Zaehler(object):
def __init__(self):
self.stand = 0
def null(self):
self.stand = 0
def weiter(self):
self.stand = self.stand + 1
def zurueck(self):
if self.stand > 0:
self.stand = self.stand - 1
Auch wenn einige Schreibweisen zunächst etwas merkwürdig sind, so kann man die Bedeutung der Bestandteile dieser Klassendeklaration doch nachvollziehen.
Die Operation __init__ führt ein Attribut zur Verwaltung des Zählerstands ein und
versieht es mit einem Anfangswert.
Die Methode null() setzt den Wert des Zählerstand-Attributs auf 0.
Die Methode weiter() erhöht den Wert des Zählerstand-Attributs um 1.
Die Methode zurueck() verringert den Wert des Zählerstand-Attributs um 1, sofern dieser
größer als 0 ist.
Erzeugung und Verwendung eines Zähler-Objekts
Mit Hilfe des Bauplans lässt sich ein Objekt der Klasse Zaehler
erzeugen. Ein solches Objekt - das an die Variablen zaehler gebunden wird - wird
im folgenden Programm zur Datenverwaltung und Datenverarbeitung benutzt.
# Datenmodellobjekt
from datenmodell import Zaehler
zaehler = Zaehler()
# GUI - Ereignisbehandlung
def buttonWeiterClick():
zaehler.weiter()
labelZahl.config(text=str(zaehler.stand))
def buttonZurueckClick():
zaehler.zurueck()
labelZahl.config(text=str(zaehler.stand))
def buttonNullClick():
zaehler.null()
labelZahl.config(text=str(zaehler.stand))
# GUI-Objekte
from tkinter import *
# Fenster
tkFenster = Tk()
tkFenster.title('Zähler')
tkFenster.geometry('170x125')
# Label
labelZahl = Label(master=tkFenster, text=str(zaehler.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()
In den Ereignisbehandlungsmethoden wird das Objekt zaehler mit
Methodeaufrufen wie z.B. zaehler.zurueck() aufgefordert,
die in der Methodendefinition festgelegten Anweisungen auszuführen.
Beachte, dass Datenmodell-Klassen immer so konzipiert werden sollten, dass sie auch ohne eine GUI benutzt werden können. Hierdurch wird ermöglicht, dass diese Klassen in verschiedenen Programmen als Baustein benutzt werden kann. Dieses Prinzip der Trennung zwischen Datenmodell und GUI werden wir im Abschnitt Datenmodell und grafische Benutzeroberfläche noch genauer erläutern.
Aufgabe 1
Teste das oben gezeigte Programm.
Aufgabe 2
Mit einem Programm soll die Anmeldung mit einem Passwort simuliert werden.
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 Bauplan für ein Datenmodell:
class AnmeldeVerwalter(object):
def __init__(self):
self.passwort = 'BAB'
self.eingabe = ''
self.zaehlerEingabe = 0
self.rueckmeldung = 'Gib das Passwort *** ein.'
def neuerVersuch(self):
self.eingabe = ''
self.zaehlerEingabe = 0
self.rueckmeldung = 'Gib das Passwort *** ein.'
def eingabeAuswerten(self, zeichen):
self.zaehlerEingabe = self.zaehlerEingabe + 1
self.eingabe = self.eingabe + zeichen
if self.zaehlerEingabe == 3:
if self.eingabe == self.passwort:
self.rueckmeldung = 'Bravo, du hast es geschafft!'
else:
self.rueckmeldung = 'Nein, das war nichts!'
Ergänze das folgende Programmgerüst zu einem lauffähigen Programm.
# Datenmodell
from datenmodell_anmelden import AnmeldeVerwalter
aVerwalter = AnmeldeVerwalter()
# 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=aVerwalter.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()