Ein einfaches Programm¶
Ein einfaches Programm beispiel2.py, das eine Benutzeroberfläche aus der Datei beispiel2.ui anzeigt:
Quellcode¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #!/usr/bin/env python
#-*- coding: utf-8 -*-
import gtk
class MyApp(object):
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file("beispiel2.ui")
self.builder.connect_signals(self)
self.win = self.builder.get_object('window1')
self.path = None
def run(self):
try:
gtk.main()
except KeyboardInterrupt:
pass
def quit(self):
gtk.main_quit()
def ask_for_filename(self, title, default=None):
dlg = gtk.FileChooserDialog(title=title,
parent=self.win,
buttons=(gtk.STOCK_CANCEL,
gtk.RESPONSE_REJECT,
gtk.STOCK_OK,
gtk.RESPONSE_OK))
if default is not None:
dlg.set_filename(default)
result = dlg.run()
if result == gtk.RESPONSE_OK:
path = dlg.get_filename()
else:
path = None
dlg.destroy()
return path
def info_msg(self, msg):
dlg = gtk.MessageDialog(parent=self.win,
type=gtk.MESSAGE_INFO,
buttons=gtk.BUTTONS_OK,
message_format=msg
)
dlg.run()
dlg.destroy()
#####################
## Signal-Behandlung
#####################
###############
## Hauptfenster
def on_window1_delete_event(self, *args):
self.quit()
###########
## Aktionen
def on_act_quit_activate(self, *args):
self.quit()
def on_act_info_activate(self, *args):
self.info_msg('Info')
def on_act_delete_activate(self, *args):
self.info_msg('Löschen')
def on_act_paste_activate(self, *args):
self.info_msg('Einfügen')
def on_act_copy_activate(self, *args):
self.info_msg('Kopieren')
def on_act_cut_activate(self, *args):
self.info_msg('Ausschneiden')
def on_act_save_activate(self, *args):
self.info_msg('Speichern')
def on_act_new_activate(self, *args):
self.info_msg('Neu')
def on_act_save_as_activate(self, *args):
path = self.ask_for_filename('Datei öffnen', self.path)
if path is None:
self.info_msg('Datei nicht gespeichert')
else:
self.path = path
self.info_msg('Datei "%s" gespeichert.'%self.path)
def on_act_open_activate(self, *args):
path = self.ask_for_filename('Datei öffnen', self.path)
if path is None:
self.info_msg('Keine Datei ausgewählt')
else:
self.path = path
self.info_msg('Datei "%s" ausgewählt.'%self.path)
if __name__ == '__main__':
app = MyApp()
app.run()
|
Beschreibung¶
Der Anfang (Zeile 1-25) ist weitgehend der gleiche wie in Hallo Welt!. Zusätzlich wird das Hauptfenster in der Variablen self.win gespeichert (Zeile 13). In Zeile 14 wird die variable self.path, die für den von Datei öffnen und Datei speichern verwendeten Dateinamen benutzt wird, auf None gesetzt.
Die Funktion ask_for_filename (Zeile 26-42) nimmt als Parameter einen Fenstertitel (title) und optional einen Dateinamen als Voreinstellung (default).
Zuerst wird eine Instanz von gtk.FileChooserDialog erzeugt (Zeile 27-32). Falls default angegeben wurde, wird dieser als Voreinstellung für den Dialog gesetzt (Zeile 34-35). Damit ist der Dialog fertig.
In Zeile 37 wird der Dialog ausgeführt (siehe gtk.Dialog.run()) und die Antwort der Variablen result zugewiesen.
Falls die Antwort den Wert gtk.RESPONSE_OK hat (also der Anwender den OK-Knopf gedrückt hat) wird der ausgewählte Dateiname über die Methode gtk.FileChooserDialog.get_filename() abgefragt und in path abgelegt (Zeile 39-40); andernfalls bekommt path den Wert None (Zeile 41-42).
Dann wird der Dialog zerstört (Zeile 44) und der Inhalt von path als Funktionsergebnis zurückgegeben (Zeile 45).
Wichtig ist hier, dass gtk.FileChooserDialog.get_filename() aufgerufen wird bevor der Dialog zerstört wird.
Die Funktion info_msg (Zeile 48-58) nimmt als Parameter einen Meldungstext (msg).
In Zeile 49-53 wird dann eine Instanz von gtk.MessageDialog erzeugt, die den Typ gtk.MESSAGE_INFO hat, einen OK-Knopf enthält und msg als Meldung anzeigt.
Der Dialog wird dann angezeigt (Zeile 54) und wieder zerstört (Zeile 55).
Zeile 65-66 enthält die schon aus Hallo Welt! bekannte Behandlungsroutine für das delete-Signal des Fensters.
In Zeile 71-72 wird die Behandlungsroutine für das activate-Signal der Beenden-Aktion (Quit) definiert, die die oben definierte Funktion quit aufruft, um das Programm zu beenden.
Zeile 74-93 definiert einfache Behandlungsroutinen für die activate-Signale verschiedener Aktionen, die jeweils info_msg aufrufen, um eine Meldung anzuzeigen.
Die Behandlungsroutinen für die activate-Signale der Aktionen Speichern unter (Save as) und Datei öffnen (Open) benutzen die oben definierte Funktion ask_for_filename, um einen Dateinamen vom Benutzer zu erfragen (Zeile 96, 104). Falls dieser den Wert None hat (also der Dialog nicht mit OK beendet wurde), wird eine entsprechende Meldung ausgegeben (Zeile 97-98 und 105-106), andernfalls wird der neue Dateiname in self.path gespeichert und eine Erfolgsmeldung ausgegeben (Zeile 99-101 und 107-109).
Der Schluss des Programms (Zeile 112-114) entspricht dann wieder dem von Hallo Welt!.
