Ein einfaches Programm

 

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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/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.path = None

    def obj(self, name):
    	"""
	Gibt Glade-Object 'name' zurück
	"""
        return self.builder.get_object(name)

    def run(self):
        """
	Startet die zentrale Warteschleife von Gtk
	"""
        try:
            gtk.main()
        except KeyboardInterrupt:
            pass
    
    def quit(self):
        """
        Verlässt die zentrale Warteschleife von Gtk

	"""
        gtk.main_quit()


    def ask_for_filename(self, title, default=None):
        """
        Fragt den Benutzer nach einem Dateinamen.
        """
        dlg = gtk.FileChooserDialog(title=title,
                                    parent=self.obj('window1'), 
                                    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):
        """
        Zeigt einen Meldungstext an
        """
        dlg = gtk.MessageDialog(parent=self.obj('window1'), 
                                type=gtk.MESSAGE_INFO, 
                                buttons=gtk.BUTTONS_OK,
                                message_format=msg
                                )
        dlg.run()
        dlg.destroy()


###############################
## Signal-Behandlungsroutinen
###############################

###############
## 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()

Bildschirmfoto

Das Programm erzeugt ein einfaches Fenster:

../../../_images/beispiel2.png

Beschreibung

Der Anfang (Zeile 1-35) ist weitgehend der gleiche wie in Hallo Welt!. Zusätzlich wird in Zeile 14 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 28-60) nimmt als Parameter einen Fenstertitel (title) und optional einen Dateinamen als Voreinstellung (default).

Zuerst wird eine Instanz von gtk.FileChooserDialog erzeugt (Zeile 42-48). Falls default angegeben wurde, wird dieser als Voreinstellung für den Dialog gesetzt (Zeile 49-50). Damit ist der Dialog fertig.

In Zeile 52 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 54-55); andernfalls bekommt path den Wert None (Zeile 56-57).

Dann wird der Dialog zerstört (Zeile 59) und der Inhalt von path als Funktionsergebnis zurückgegeben (Zeile 60).

Wichtig ist hier, dass gtk.FileChooserDialog.get_filename() aufgerufen wird bevor der Dialog zerstört wird.

Die Funktion info_msg (Zeile 63-73) nimmt als Parameter einen Meldungstext (msg).

In Zeile 67-71 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 72) und wieder zerstört (Zeile 73).

Zeile 83-84 enthält die schon aus Hallo Welt! bekannte Behandlungsroutine für das delete-Signal des Fensters.

In Zeile 89-90 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 92-111 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) (Zeile 113-121 bzw. 121-127) benutzen die oben definierte Funktion ask_for_filename, um einen Dateinamen vom Benutzer zu erfragen (Zeile 114, 122). Falls dieser den Wert None hat (also der Dialog nicht mit OK beendet wurde), wird eine entsprechende Meldung ausgegeben (Zeile 115-116 und 123-124), andernfalls wird der neue Dateiname in self.path gespeichert und eine Erfolgsmeldung ausgegeben (Zeile 118-119 und 126-1127).

Der Schluss des Programms (Zeile 112-114) entspricht dann wieder dem von Hallo Welt!.