gtk.Builder()和多个glade文件中断 [英] gtk.Builder() and multiple glade files breaks
问题描述
我有一个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 self.builder = gtk.Builder()应用程序运行,但小部件信号丢失。
self.builder.add_from_file(ui_for_one.glade)
self.show()#这里有无尽的循环吗?
class two(object):#这是笔记本中的页面。
def __init __(self):
self.builder = gtk.Builder()
self.builder.add_from_file(ui_for_two.glade)
self.some_container = self.builder (self.one,False,False)
使用相同的 有关更多信息,请查看这些 Glade教程。 I have a glade gui, and I want to insert another object using a glade file as well. When I do it as bellow (this is essentially what I am doing) the whole app hangs and the self.show() and maxes out the CPU at 100%. If I replace the first line of one's init() with self.builder = gtk.Builder() then the app runs, I can set widgets, ie: set contents of entry's, set and change the values of comboboxes. But I cant respond to signals, button clicks never call the handler. In the real code the object two is set as a page in a note book, and I have multiple other pages, the gtk.main() is in the object that owns the notebook. All these work as expected, it's just the object one that fails. Any clues? I have tried calling self.builder.connect_signals() for every widget but it still fails to notice them.
Is there a good reason for using the same For more info, check out these Glade tutorials. 这篇关于gtk.Builder()和多个glade文件中断的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! gtk.Builder $ c有很好的理由$ c>两个类中的对象?
这可能是您的问题的原因。在你的一个
类中,你加载了一个glade文件,但你从来没有对它的小部件做任何事情。像这样的应该工作:
$ p $ class 1(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)
#没有理由在这里调用self.show(),这应该是手动完成。
#您的回调函数在这里
class two(object):#这是笔记本中的页面。
def __init __(self):
self.builder = gtk.Builder()
self.builder.add_from_file(ui_for_two.glade)
self.some_container (self.one,False,False)
self.some_container.show_all(self.one, )#递归地显示some_container及其所有子窗口小部件
self.builder.connect_signals(self)
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)
gtk.Builder
object in two classes?
This might be the cause of your problem. In your one
class, you load a glade file but you never do anything with its widgets. Something like this should work: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)