让我们解释一下环境。
我正在使用pygtk构建GUI。在我的代码的某些时候,我创建了一个gtk.ScrolledWindow并设置了一个名称(这里是代码):
top_swin = gtk.ScrolledWindow()
top_swin.set_name('script-desc-swin')
稍后在代码的其他部分我需要查找这个小部件,所以我试过这个:
self.gui.get_object('script-desc-swin')
self.gui是一个gtk.Builder对象,它是使用Glade创建的XML文件构建的。这一行返回None,所以我认为get_object()只能用于查找在GLADE FILE上定义的对象(请注意,滚动窗口是在代码中以编程方式创建的,而不是使用Glade)。我尝试了gtk.Buildable.get_internal_child()方法,但这次我使用它时遇到了问题,因为文档说第一个参数是gtk.Builder(所以我通过了我的self.gui),但后来我得到了这个:
swin = gtk.Buildable.get_internal_child(self.gui, 'script-desc-swin')
TypeError: descriptor 'get_internal_child' requires a 'gtk.Buildable' object but received a 'gtk.Builder'
所以我试着调用get_internal_child,好像它是gtk.Builder的一个方法(尽管我先查看了文档并意识到gtk.Builder没有实现gtk.Buildable ......反正我试过了):
swin = self.gui.get_internal_child('script-desc-swin')
AttributeError: 'gtk.Builder' object has no attribute 'get_internal_child'
当然我得到了这个,就像我说的gtk.Builder(self.gui)没有实现gtk.Buildable。
在所有这些混乱之后,我不知道如何查找滚动窗口(或任何其他小部件),所以我正在做的是寻找XML文件中指定的小部件(换句话说,使用Glade创建) ,然后我得到它的孩子/孩子并重复这个过程。这就像“OMFG!什么是密码!”所以即使我的应用程序运行,我真的想改变那些丑陋的代码:
box = self.gui.get_object('MAIN_VIEW_BOX')
hpaned = box.get_children()[1]
hpaned2 = hpaned.get_child2()
swin = hpaned2.get_child1()
一个包含hpaned的框,其中包含另一个hpaned,其中包含第一个孩子THE SCROLLED WINDOW。
几乎可以肯定答案很简单......: - s
感谢!