gtk.Builder() 和多个 glade 文件崩溃

2 投票
1 回答
1923 浏览
提问于 2025-04-15 18:25

我有一个用 Glade 制作的图形界面,现在想用另一个 Glade 文件插入一个新对象。

当我按照下面的方式操作时(这基本上就是我在做的事情),整个应用程序就会卡住,self.show() 也会让 CPU 使用率飙到 100%。如果我把某个对象的 init() 方法里的第一行改成 self.builder = gtk.Builder(),那么应用程序就能正常运行了,我可以设置一些控件,比如输入框的内容,或者设置和改变下拉框的值。但我无法响应信号,按钮点击事件也无法调用相应的处理函数。

在实际代码中,第二个对象被设置为一个笔记本中的页面,还有多个其他页面,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 个回答

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 教程

撰写回答