next up previous contents index 6264666870
Next: 4.3 Radiobutton Up: 4. Das zweite Programm Previous: 4.1 Starten des Programms   Contents   Index

4.2 Details

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?

  1. 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.
  2. __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.
  3. Der dritte Name gehört einer Methode4.2, die say_hi heisst.
  4. 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 up previous contents index 6264666870
Next: 4.3 Radiobutton Up: 4. Das zweite Programm Previous: 4.1 Starten des Programms   Contents   Index
Heiko Schroeder 2003-03-23