gtk.Builder() 和多个 glade 文件崩溃
我有一个用 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 教程。