Howto: GUIs mit Python: pygtk + glade
Pygtk ist ein GUI-Toolkit, neben ihm gibt es noch viele andere (pyqt, wxPython, tkinter ...)
Glade ist ein Programm mit dem sich .glade Dateien erstellen lassen. Das sind .xml Dateien welche das GUI darstellen und sich per libglade in ein Programm einbinden lassen. Dadurch ist es möglich Design und Code ohne größere Probleme zu trennen.
GUI Designen mit Glade
Bei GTK wird grundsätzlich alles in Boxen gegliedert. Als Beispiel sehen wir uns dieses GUI an:

Das GUI besteht aus einer Vertikalen Box in der eine Menubar, ein Notebook und eine Statusbar hinzugefügt wurden, innerhalb des Notebooks wurde eine weitere Vertikale Box hinzugefügt in der sich ein Treeview und eine Horizontale Button Box befinden.
Hier sehen wir auch gleich eine der Eigenheiten des Boxen-Modells: Die horizontale Button Box nimmt ebenso viel Platz ein wie der Treeview. Das lässt sich allerdings leicht ändern:

Bei dem Packing Tab lässt sich mit den Optionen Expand und Fill einstellen wie sich das Widget verhalten soll.
Das Box-Modell mag anfangs vielleicht etwas gewöhnungsbedürftig sein, hat aber durchaus seine Vorteile.
Alles weitere erklärt der Designer ohnehin fast von selbst - learning by doing. Bevor wir aber zu unserem Programm-Code kommen können benötigen wir noch etwas wichtiges:
Signals
Wenn man später in unserer Oberfläche auf einen Button klickt, so erhält GTK einen Event. Damit unser Programm auf einen Event reagieren kann, müssen wir Signals definieren:

Unser Button soll beim clicked Event später den on_button1_clicked Callback auslösen.
Das zugehörige Python Programm
Zuerst importieren wir die benötigten Module:
1 2 3 4 | import pygtk import gtk import gtk.glade import gobject |
Weiter geht es mit einer Klasse für unser Fenster:
1 2 3 4 5 6 | class Window: def __init__(self): self.xml = gtk.glade.XML(os.path.join(os.path.dirname(sys.argv[0]), 'foo.glade')) self.window = self.xml.get_widget('window1') #... self.window.show() |
Zuerst holen wir uns den XML-Tree aus der Glade-Datei, danach können wir uns auch gleich das Window-Widget rausholen.
Wichtig: Die Namen hier müssen mit den Namen die unsere Widgets im Glade-Designer hatten übereinstimmen.
Natürlich können / müssen noch weitere Widgets aus dem XML-Tree geholt werden, wir könnten z.B. auch noch unseren TreeView holen:
1 | self.treeview_something = self.xml.get_widget('treeview_something') |
Den benötigen wir im Moment allerdings nicht, wir wollen beim Klick auf unseren Button ein MessageDialog öffnen, dazu haben wir ja auch bereits das Signal im Glade-Designer definiert. Nun müssen wir dieses Signal noch an eine Funktion binden:
1 2 | self.button = self.xml.get_widget('button1') self.button.connect('clicked', self.on_button1_clicked) |
Das wäre eine Möglichkeit, dann hätte es aber keinen Sinn gehabt es im Glade-Designer zu definieren. Einfacher geht es so:
1 2 3 4 | dic = {}
for key in dir(self.__class__):
dic[key] = getattr(self,key)
self.xml.signal_autoconnect(dic)
|
Dadurch werden alle Signale welche in der Glade Datei festgelegt wurden automatisch an die entsprechenden Funktionen gebunden. Nun fehlt allerdings noch unsere on_button1_clicked Funktion:
1 2 3 4 5 6 7 | def on_button1_clicked(self, widget): dia = gtk.MessageDialog() dia.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_YES) dia.set_default_response(gtk.RESPONSE_YES) dia.set_markup(`Ich bin ein MessageDialog`) dia.run() dia.destroy() |
Zum Abschluss müssen wir unsere Klasse noch aufrufen:
1 2 3 | if __name__ == `__main__`: Window() gtk.main() |
Hiermit wären wir auch schon am Ende.
Wenn man sich weiter damit beschäftigen will empfiehlt sich die pygtk homepage und die Tutorials sowie die Referenz die auf der Homepage zu finden sind.