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