2010-01-24 4 views
1

J'ai un glide glui, et je veux aussi insérer un autre objet en utilisant un fichier glade.gtk.Builder() et plusieurs sauts de fichiers glade

Lorsque je le fais en tant que ci-dessous (c'est essentiellement ce que je fais) l'ensemble de l'application se bloque et le self.show() et maxi le processeur à 100%. Si je remplace la première ligne de init() avec self.builder = gtk.Builder() alors l'application fonctionne, je peux définir des widgets, par exemple: définir le contenu des entrées, définir et modifier les valeurs des comboboxes. Mais je ne peux pas répondre aux signaux, les clics sur les boutons n'appellent jamais le gestionnaire.

Dans le code réel, l'objet deux est défini comme une page dans un carnet de notes et j'ai plusieurs autres pages, le gtk.main() est dans l'objet qui possède le bloc-notes. Tout cela fonctionne comme prévu, c'est juste l'objet qui échoue.

Des indices? J'ai essayé d'appeler self.builder.connect_signals() pour chaque widget mais il ne parvient toujours pas à les remarquer.

class one(gtk.VBox): 
def __init__(self, builder): 
     gtk.VBox.__init__(self) 
     self.builder = builder # if this is self.builder = gtk.Builder() app runs but widget signals go missing. 
     self.builder.add_from_file("ui_for_one.glade") 
    self.show() # Endless loop here? 

class two(object): # This is the page in a notebook. 
def __init__(self): 
    self.builder = gtk.Builder() 
    self.builder.add_from_file("ui_for_two.glade") 
    self.some_container = self.builder.get_object("some_container") 
    self.one = one(self.builder) 
    self.some_container.pack_start(self.one, False, False) 

Répondre

2

est-il une bonne raison d'utiliser le même objet gtk.Builder dans deux classes?
Cela pourrait être la cause de votre problème. Dans votre classe one, vous chargez un fichier Glade mais vous ne faites jamais rien avec ses widgets. Quelque chose comme cela devrait fonctionner:

class one(gtk.VBox): 

    def __init__(self): 
    gtk.VBox.__init__(self) 
    self.builder = gtk.Builder() 
    self.builder.add_from_file("ui_for_one.glade") 
    some_widget = self.builder.get_object("some_widget") 
    self.add(some_widget) 
    self.builder.connect_signals(self) 
    # No reason to call self.show() here, that should be done manually. 

    #Your callback functions here 

class two(object): # This is the page in a notebook. 

    def __init__(self): 
    self.builder = gtk.Builder() 
    self.builder.add_from_file("ui_for_two.glade") 
    self.some_container = self.builder.get_object("some_container") 
    self.one = one() 
    self.some_container.pack_start(self.one, False, False) 
    self.some_container.show_all() #recursively show some_container and all its child widgets 

    self.builder.connect_signals(self) 

Pour plus d'informations, consultez ces Glade tutorials.

+0

Je n'avais pas essayé self.builder.connect_signals (self) et cela a corrigé le problème. J'utilise builder depuis peu de temps (en utilisant libglade before) et n'ai pas encore appelé builder.connect_signals (self) jusqu'à maintenant. Savez-vous comment certaines choses fonctionnent sans l'appeler et d'autres pas? – Rob

+0

Eh bien, je ne peux pas voir le reste de votre code, mais peut-être que vous avez manuellement connecté les signaux à certains widgets, mais pas le reste? –

+0

Ignorer mon commentaire, je l'avais appelé. Dans la classe de code réel, deux classes de base l'appellent. Certains où j'ai eu l'idée dans ma tête que gtk.Builder l'a fait automagiquement. À la votre! – Rob

Questions connexes