Datenverwaltung mit Datenmodellobjekte

Beispiel - Zähler

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

Anwendungsfenster

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.

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

Fehler melden

X

Suche