Seite 1 von 1

Fenster doppler ;-}

Verfasst: Freitag 26. September 2008, 10:05
von stefan3003
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

Verfasst: Freitag 26. September 2008, 10:42
von Leonidas
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``.

Verfasst: Freitag 26. September 2008, 12:15
von stefan3003
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

Verfasst: Freitag 26. September 2008, 12:34
von stefan3003
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 :]

Verfasst: Freitag 26. September 2008, 22:06
von Trundle
`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()``).

Verfasst: Samstag 27. September 2008, 07:26
von stefan3003
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! :)