2010-01-24 44 views
1

我有一個glade gui,我想用glade文件插入另一個對象。gtk.Builder()和多個glade文件中斷

當我這樣做(這實際上是我在做什麼)整個應用程序掛起和self.show()並最大限度地在CPU 100%。如果我使用self.builder = gtk.Builder()替換人的第一行init(),那麼應用程序將運行,我可以設置小部件,即:設置條目的內容,設置和更改組合框的值。但我不能對信號作出響應,按鈕點擊從不會對處理程序進行調用。

在實際代碼中,對象2被設置爲筆記本中的頁面,並且我有多個其他頁面,gtk.main()位於擁有筆記本的對象中。所有這些都按預期工作,它只是失敗的對象。

任何線索?我曾嘗試爲每個小部件調用self.builder.connect_signals(),但仍未注意到它們。

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) 

回答

2

在兩個類中使用相同的gtk.Builder對象是否有很好的理由?
這可能是您的問題的原因。在你的one類中,你加載了一個glade文件,但你從來沒有對它的小部件做任何事情。這樣的東西應該工作:

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) 

欲瞭解更多的信息,請查看這些Glade tutorials

+0

我沒有試過self.builder.connect_signals(self),並且已經解決了這個問題。我一直只使用builder(之前使用libglade),並且直到現在還沒有調用builder.connect_signals(self)。你知道有些事情是如何調用它而另一些不行的? – Rob 2010-01-25 17:28:53

+0

嗯,我看不到你的代碼的其餘部分,但也許你手動連接信號到一些小部件,但沒有其餘的? – 2010-01-25 17:30:40

+0

忽略我的評論,我一直在呼籲。在真正的代碼類中,有兩個基類調用它。在我腦海中有一些想法讓gtk.Builder自動完成了這一點。 乾杯! – Rob 2010-01-25 17:50:53