让我们解释一下环境。
我正在使用 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 文件构建的。此行返回无,所以我认为可能是 get_object() 只能用于查找在 GLADE 文件上定义的对象(请注意,滚动窗口是在代码中以编程方式创建的,而不是 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,其中包含作为第一个孩子的滚动窗口。
几乎可以肯定答案会很简单...... :-s
感谢!