



Next: 4.3 Radiobutton
Up: 4. Das zweite Programm
Previous: 4.1 Starten des Programms
Contents
Index
Fast das gesamte Programm wurde hier als Klasse ausgeführt. Wir fangen
mit der Besprechung des Programms etwas unorthodox bei denjenigen
Zeilen an, die nicht in die Klasse eingebunden sind.
- root=Tk():
- Das kennen wir schon. Es wird ein Fenster mit dem Namen
root eingerichtet.
- app=App(root):
- Hier wird es interessant. Durch App(root)
wird eine Instanz der Klasse App erzeugt, die offenbar die
gesamte »Applikation« dieses Programms4.1 darstellt. Da der Name root übergeben wird, muss in
der Klasse App zwangsläufig ein Konstruktor der Form __init__
existieren. Fehlt eine explizite Angabe dieses Konstruktors, kann
nur ein Aufruf der Form name=App() erfolgen. Die erzeugte Instanz
heisst app. Dieser Name wird allerdings im weiteren Verlauf
nicht benötigt. Unterscheiden Sie deutlich zwischen dem Klassennamen
App und dem Instanznamen app. Schauen wir uns nun den Inhalt
der Klasse etwas genauer an:
- class App:
- Diese Zeile markiert nicht etwa nur den Anfang der Klassenfestlegung,
sondern ist selbst eine Anweisung. Der Operator class generiert
eine Klassenobjekt, dem der Name App zugewiesen wird. Welche
Namen sind nun lokal in der Klasse verfügbar?
- self: Wie in jeder Klasse üblich, ist self die Schnittstelle
der Klasse zu den erzeugten Instanzen. Wird eine Instanz - in diesem
Falle also app - erzeugt, so weist der self-Paramter
auf den Namen app.
- __init__: Dies ist wie gesagt eine Funktion, die den Konstruktor
App() neu definiert. Der Name __init__ ist also
immer mit dem Klassennamen - in diesem Falle App - identisch.
- Der dritte Name gehört einer Methode4.2, die say_hi heisst.
- Immer etwas versteckt sind die Attribute einer Klasse. Es handelt
sich dabei um diejenigen Datenobjekte, die über einen Namen der Gestalt
self.name definiert werden. Wir sehen hier zwei Namen, self.button
und self.hi_there, die auf Instanzen der Klasse Button
verweisen
- def __init__(self, master):
- Noch einmal zurück zum Konstruktor.
- frame=Frame(master):
- Mit dieser Anweisung generiert der Konstruktor
eine Instanz der Tk-Klasse Frame, die wir im ersten
Beispiel schon kurz erwähnten. Ein Frame ist
ein widget, das beliebig viele weitere Widgets enthalten kann.
Eine Frame-Instanz muss aber immer in einem Fenster (window)
eingebettet sein. Daher muss dem Konstruktor von Frame
der Name des Hauptfensters (hier master genannt) übergeben
werden.
- self.button=Button(...):
- Objekte der Klasse Button
unterscheiden sich von Objekten der Klasse Label, wie wir sie
im ersten Besipiel betrachtet haben, im wesentlichen dadurch, dass
der Button noch ein Kommando ausführen kann. Durch command=frame.quit
zeigt der Name command, der zu der Klasse Button gehört
nicht mehr länger auf das voreingestellt Objekt NONE, sondern
auf den Namen einer Methode der Frame-Instanz frame.
Diese Systemmethode ist in der Frame-Klasse als self.quit festgelegt
und hat keine weitere Aufgabe als das Instanzobjekt zu zerstören4.3. Der Parameter fg (foreground) dient der Konfiguration des
Buttons und existiert auch für Label-Instanzen.
- self.button.pack(side=LEFT):
- Hier sehen wir zum ersten Mal, dass
dem Packer eine Information über die Lage der Instanz in dem umgebenden
Fenster übergeben wird: der Name side des Packers zeigt jetzt
auf das Objekt LEFT, das ein im Packer definierte Methode ist,
die das Objekt an die linke Position des umgebenden Fensters setzt.
- self.hi_there=Button(...):
- Diese Anweisung zeigt, wie man
eine selbst geschriebene Methode durch Buttonklick ausführen kann.
Dabei wird dem Namen lediglich der Name dieser Methode übergeben.
Wir sehen, dass die Methode say_hi später in der Klasse definiert
wird4.4. Natürlich lautet der Name für den Aufruf innerhalb der Klasse self.say_hi
und nicht einfach nur say_hi, was ein Name wäre, der nur innerhalb
des Konstruktors seine Gültigkeit hätte.
- self.hi_there.pack(side=LEFT):
- Etwas merkwürdig ist es, dass nun
auch der Button self.hi_there nach links gepackt werden soll,
wo sich doch bereits dort der Button self.button befindet.
Richtig, der Packer bezieht sich in der Positionsangabe immer auf
den freien Platz des umgebenden Fensters.
- root.mainloop():
- Hier wird wieder die Event-Schleife des Hauptfensters
aufgerufen (siehe Beispiel 1).




Next: 4.3 Radiobutton
Up: 4. Das zweite Programm
Previous: 4.1 Starten des Programms
Contents
Index
Heiko Schroeder
2003-03-23