Fenster doppler ;-}

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Hallo,

ich hatte geplant einem Programm von mir über das Wochenende eine schicke GUI zu verpassen, zum Testen hatte ich erstmal folgendes gebraut und bin schon direkt auf ein Problem gestossen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import string

try:
    import pygtk
    pygtk.require("2.0")
except:
    pass
try:
    import gtk
    import gtk.glade
except:
    print "Fehler beim import"
    sys.exit(1)

class AboutDialog:
    def __init__(self):
        self.gladefile = "/home/stefan/gladetest.glade"
        self.wTree = gtk.glade.XML(self.gladefile)
        self.about = self.wTree.get_widget("AboutWindow")
        
    def run(self):
        self.about.show_all()
        self.about.run()
        self.about.destroy()       

class MainWindow:
        def __init__(self):
            self.gladefile = "/home/stefan/gladetest.glade"
            self.wTree = gtk.glade.XML(self.gladefile)
            
            self.window = self.wTree.get_widget("MainWindow")
            if (self.window):
                self.window.connect("destroy", gtk.main_quit)

            dic = { "on_menu_quit_selected" : gtk.main_quit,
                    "on_menu_about_selected" : self.menu_about_selected
                }

            self.wTree.signal_autoconnect(dic)

        def menu_quit_selected(self, widget):
            gtk.main_quit()
            
        def menu_about_selected(self, widget):
            AboutDialog().run()
            
if __name__ == "__main__":
    fenster = MainWindow()
    gtk.main()
Das Problem ist nun das immer wenn ich Help/About auswähle eine neue Instanz des Mainwindows angezeigt wird.
Hat jemand eine Idee warum das so ist bzw. wie man das vermeiden kann ?

Das Glade-File habe ich unter http://ub0.cc/1y/1g abgelegt.
(kennt jemand einen vergleichbaren Service ohne Flash ?)

Vielen Dank & schönes Wochenende,
Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn man die Datei einmal statt zweimal aufmacht gibt es auch keine Probleme:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import string

import gtk
import gtk.glade

class AboutDialog(object):
    def __init__(self, wTree):
        self.about = wTree.get_widget("AboutWindow")

    def run(self):
        self.about.show()
        self.about.run()
        self.about.destroy()

class MainWindow(object):
        def __init__(self):
            self.gladefile = "gladetest.glade"
            self.wTree = gtk.glade.XML(self.gladefile)

            self.window = self.wTree.get_widget("MainWindow")
            if self.window:
                self.window.connect("destroy", gtk.main_quit)

            self.wTree.signal_autoconnect({
                    "on_menu_quit_selected" : gtk.main_quit,
                    "on_menu_about_selected" : self.menu_about_selected
            })

        def menu_about_selected(self, widget):
            AboutDialog(self.wTree).run()

if __name__ == "__main__":
    fenster = MainWindow()
    gtk.main()
P.S.: Nicht jedem sein $HOME ist ``/home/stefan``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Leonidas hat geschrieben:Wenn man die Datei einmal statt zweimal aufmacht gibt es auch keine Probleme:
Argh. Danke! :)
Leonidas hat geschrieben:P.S.: Nicht jedem sein $HOME ist ``/home/stefan``.
Wohl war ;)

Gruß & schönes Wochenende,
Stefan
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Hmm. Wenn ich jetzt zweimal hintereinander das About Menu auswähle stürzt das ganze mit dieser Fehlermeldung ab:
Traceback (most recent call last):
File "test.py", line 34, in menu_about_selected
AboutDialog(self.wTree).run()
File "test.py", line 15, in run
self.about.show()
AttributeError: 'NoneType' object has no attribute 'show'
Hast du noch eine Idee was sich durch den Aufruf des Fensters verändert ? Ich ging davon aus das nach dem destroy() alles beim alten ist, scheinbar ist dem nicht so :]
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

`destroy()` zerstört den Dialog, wodurch er nicht wiederverwendbar ist. Entweder du erstellst jedes Mal einen neuen Dialog, oder du versteckst ihn nur (mit ``hide()``).
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Trundle hat geschrieben:`destroy()` zerstört den Dialog, wodurch er nicht wiederverwendbar ist. Entweder du erstellst jedes Mal einen neuen Dialog, oder du versteckst ihn nur (mit ``hide()``).
Ah! Langsam daäämerts ... Vielen Dank! :)
Antworten