gtk.Builder()和多个glade文件中断

时间:2010-01-24 23:26:35

标签: python gtk pygtk

我有一个glade gui,我也希望使用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)

1 个答案:

答案 0 :(得分:3)

在两个类中使用相同的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