Kapitel 16
Layout
474
#4: Das Objekt der (weiter unten definierten) Klasse Display wird in die oberste Reihe des
Rasters (
row=0) eingebunden und erstreckt sich über alle Spalten. Als Unterklasse von
Entry hat es die grid()-Methode geerbt. Die sticky-Option sorgt dafür, dass das Widget
(unabhängig von seiner mit
width vorgegebenen Größe) in Ost-West-Richtung den gesam-
ten Platz der ersten Zeile ausfüllt.
#5: In der for-Schleife werden sämtliche Objekte der Klasse Taste in das Raster eingefügt.
Zeilen- und Spaltennummer sowie die individuelle Beschriftung sind in einer Liste aus Tri-
peln vorgegeben.
#6: Wenn das Attribut self.ende den Wert 1 hat und damit das Ende einer Rechnung
anzeigt, wird der Inhalt des
Display-Entrys komplett gelöscht.
#7: Der Ausdruck im Display wird mittels der Standardfunktion eval() ausgewertet und
ein Gleichheitszeichen sowie das Rechenergebnis an die Display-Ausgabe angehängt.
#8: Das letzte Zeichen im Display wird gelöscht.
Abb. 16.6: UML-Klassendiagramm
16.4 Vorgehensweise bei der GUI-Entwicklung
Bei der Entwicklung einer kleineren Applikation mit grafischer Benutzungsoberfläche kann
man folgendermaßen vorgehen:
Ausgehend von einem Entwurf, der das Aussehen des GUI beschreibt, entwickeln Sie
die Master-Slave-Hierarchie der Widgets.
Sie beginnen mit dem Schreiben des Programmtextes und instanziieren die Widgets der
Benutzungsoberfläche. Funktionen oder Methoden, die über die Option
command an But-
tons gebunden sind, definiert man zunächst nur als Dummies, die aus einem Kopf und
der leeren Anweisung
pass bestehen.
Taschenrechner
Tk
Taste
Button Clear
Gleich
Display
Entry
15
475
16.4
Vorgehensweise bei der GUI-Entwicklung
Die Widgets werden mithilfe der Layout-Methoden im Applikationsfenster angeordnet.
Das Skript ist nun bereits lauffähig, Sie können das Aussehen der Benutzungsober-
fläche auf dem Bildschirm kritisch begutachten.
Die Optionen der Widgets und Layoutmanager werden so lange umkonfiguriert, bis das
Aussehen der Benutzungsoberfläche den Erwartungen entspricht.
Schließlich werden die Körper (Anweisungsfolgen) der Funktionen, die an die Buttons
gekoppelt sind, definiert.
Diese Vorgehensweise sei am Beispiel eines Vokabeltrainers mit grafischer Benutzungs-
oberfläche erläutert.
Beispiel: Vokabeltrainer
Sprachlehrer empfehlen, Vokabeln mit Karteikarten zu lernen. Auf der Vorderseite einer
Karteikarte könne ein englisches Wort stehen und auf der Rückseite eine oder mehrere
deutsche Übersetzungen. Am besten verwendet man einen Karteikasten wie in Abbildung
16.7. In der vorderen Abteilung ist ein Packen mit noch nicht gelernten Vokabeln, dahinter
sind Karten mit den Wörtern, die man schon beherrscht. Man nimmt eine Karte aus dem
vorderen Teil (
getNeueVokabel()) und prüft, ob man die Übersetzung des Wortes weiß. Ist
das der Fall (Vokabel gelernt), steckt man die Karte in die hintere Abteilung zu den anderen
bereits gelernten Vokabeln. Wird sie noch nicht beherrscht, kommt sie an das Ende des vor-
deren Kartenpackens (
legeNachHinten()). Dann nimmt man die nächste Karte aus der
vorderen Abteilung und fährt auf die gleiche Weise fort, bis sich – nach vielen Wiederholun-
gen – alle Karten hinten befinden.
Abb. 16.7: Karteikasten mit zwei Fächern
Wir entwickeln ein Trainingsprogramm mit grafischer Benutzungsoberfläche, das auf die-
ser Idee basiert. Die folgende Klassendefinition modelliert einen Karteikasten. Dessen vor-
dere Abteilung mit Karteikarten wird durch eine Liste dargestellt. Die Funktionalität der
Methoden kann Abbildung 16.7 entnommen werden.
lerne()
getNeueVokabel()
case
gelernt
noch nicht
gelernt
Karteikasten
legeNachHinten()
Kapitel 16
Layout
476
Skript:
Erläuterung:
Die Vokabeln müssen bei dieser Implementierung zuvor zeilenweise in ein Textdokument
geschrieben werden, das man mit einem Texteditor (am einfachsten direkt mit IDLE)
erstellt und z.B. in der Datei mit dem Pfad
/python/projekt/vokabeln.txt abspeichert.
In jeder Zeile ist das erste Wort eine englische Vokabel, gefolgt von einer beliebigen Anzahl
deutscher Übersetzungen. Beispiel:
#1: wortschatz ist eine Liste von Textzeilen aus der Textdatei.
#2: Erzeugt wird eine Liste von Einzelwörtern aus einer Textzeile, z.B. ['house', 'Haus'].
#3: Das Attribut self.__nochNichtGelernt wird als Liste von Wortlisten aufgebaut.
#4: Wenn die Liste nicht leer ist, wird das erste Listenelement zurückgegeben, sonst None.
# vokabeltrainer.pyw
class Karteikasten(object):
def __init__(self, datei):
self.__nochNichtGelernt = []
f = open(datei, 'r')
wortschatz = f.readlines() #1
f.close()
for zeile in wortschatz:
vokabel = zeile.split() #2
self.__nochNichtGelernt.append(vokabel) #3
def getNeueVokabel(self):
if self.__nochNichtGelernt: #4
return self.__nochNichtGelernt[0]
def lerne (self):
del self.__nochNichtGelernt[0]
def legeNachHinten(self):
self.__nochNichtGelernt.append(
self.__nochNichtGelernt[0])
del self.__nochNichtGelernt[0]
house Haus
floor Etage Boden
wall Wand Mauer

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.