2010-01-10 5 views
0

J'ai un problème avec les fenêtres PyGTK et GTK Builder. Voici une version simplifiée de mon code.Gestion de fenêtres avec pygtk

class GUI: 
def __init__(self,parent): 
    builder_file = "./ui/window.builder" 
    self.builder = gtk.Builder() 
    self.builder.add_from_file(builder_file) 

    self.window = self.builder.get_object('main') 
    self.builder.connect_signals(self) 
    self.populate_window() 
    self.window.show() 

def populate_window(self): 
    hbox = self.builder.get_object('hbox') 
    hbox.pack_start(somewidgets) 

def on_destroy(self): 
    self.window.destroy() 

Le fichier générateur gtk contient uniquement une fenêtre de niveau supérieur avec une boîte d'emballage horizontale et un signal à détruire. Cela semble fonctionner et la fenêtre est créée et peuplée très bien, mais si j'essaye de détruire la fenêtre qui a été remplie avec d'autres widgets python segfaults.

Je pense que c'est un problème avec l'emballage de nouveaux widgets qui ne sont pas dans le fichier constructeur, donc pygtk ne sait pas comment les destorer, mais je ne suis pas sûr cependant.

Merci pour toute aide.

Répondre

0

Votre gestionnaire « détruire » est appelée lorsque la fenêtre est encore dans la destruction, donc ce fragment de code:

def on_destroy(self): 
    self.window.destroy() 

va générer un appel récursif infini. En d'autres termes, vous détruisez quelque chose qui est encore en train d'être détruit. Ceci n'a rien à voir avec GtkBuilder ou des widgets codés à la main, mais je pense qu'il me manque quelque chose parce que je ne sais pas pourquoi vous devez connecter quelque chose à GtkWindow :: destroy.

1

Utilisez gtk.main_quit().

def on_destroy(self): 
    gtk.main_quit()