FileChooserDialog in GTK-Anwendung

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Jochen Skulj
User
Beiträge: 9
Registriert: Samstag 5. März 2005, 18:57
Kontaktdaten:

Hallo,

da ich momentan nicht weiterkomme, wage ich es einmal, hier meine Anfängerfrage zu stellen:

Aufgabenstellung ist simpel: nach Auswahl eines Menüpunktes soll ein Dateiauswahldialog erscheinen und danach die Datei geöffnet werden. Mein Source-Code dazu:

Code: Alles auswählen

    def execute(self, widget, data = None):
        """
        executes the command. This method has to be overwritten 
        in sublclasses. 
        Parameters:
            - widget: widget that triggers the command
            - data: additional data
        """
        chooser = gtk.FileChooserDialog("Open", self.getApplication().getMainWindow()) 
        chooser.set_default_response(gtk.RESPONSE_OK)
        chooser.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
        chooser.add_button( gtk.STOCK_OPEN, gtk.RESPONSE_OK)
        filter = gtk.FileFilter()
        filter.set_name("File")
        filter.add_pattern("*.xml")
        chooser.add_filter(filter)
        response = chooser.run()
        if response == gtk.RESPONSE_OK:
            print chooser.get_filename(), 'selected'
Die Methode execute wird an anderer Stelle mit dem activate-Signal eines MenuItems verbunden. Das Ganze läuft in einer übergeordneten Anwenung, die mit gtk.main() gestartet wird.

Das klappt auch insofern, als der FileChooser geöffnet wird. Allerdings schließt er sich nicht, wenn man auf Ok oder Abbrechen klickt. Das ist mein Problem.

Führe ich das Code-Fragment in einem eigenen kleinen Programm/Skript aus, ohne dass darin vorher gtk.main() aufgerufen wird, funktioniert das bestens.

Wo ist mein Denkfehler?

Danke, Jochen
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Der Aufrufer der `run'-Methode muss selber dafür sorgen, dass der Dialog, nachdem die Methode zurückkehrt, versteckt oder zerstört wird. Also einfach noch ein

Code: Alles auswählen

chooser.destroy()
am Ende einbauen.
Jochen Skulj
User
Beiträge: 9
Registriert: Samstag 5. März 2005, 18:57
Kontaktdaten:

Super, vielen Dank für die Antwort. Die hat mir sehr geholfen.

Besten Gruß, Jochen
Antworten