4

我正在尝试在 gtk.Builder 定义文件中使用自定义容器小部件。至于实例化这些小部件,它工作得很好:

#!/usr/bin/env python

import sys 
import gtk 

class MyDialog(gtk.Dialog):
    __gtype_name__ = "MyDialog"


if __name__ == "__main__":
    builder = gtk.Builder()
    builder.add_from_file("mydialog.glade")

    dialog = builder.get_object("mydialog-instance")
    dialog.run()

现在的问题是说我在那个对话框中有一个 gtk.TreeView 小部件。我试图弄清楚如何将该小部件绑定到 MyDialog 实例变量。

我能想到的一种便宜的替代方法是在获取对话框小部件后调用其他方法,如下所示:

dialog = builder.get_object("mydialog-instance")
dialog.bind_widgets(builder)

但这似乎相当尴尬。有没有人已经解决了这个问题,或者对如何去做有更好的想法?

谢谢,

4

1 回答 1

5

好吧,我想我回答了我自己的问题。

执行上述操作的一种方法是覆盖 gtk.Buildable 的 parser_finished(),它可以访问创建类实例本身的构建器对象。该方法在整个 .xml 文件加载后调用,因此我们可能想要获取的所有其他小部件都已经存在并已初始化:

class MyDialog(gtk.Dialog, gtk.Buildable):
    __gtype_name__ = "MyDialog"

    def do_parser_finished(self, builder):
        self.treeview = builder.get_object("treeview1")
        # Do any other associated post-initialization

需要注意的一点是,由于某种原因(至少对我而言,在 pygtk 2.12 中),如果我没有明确地从 gtk.Buildable 继承,则不会调用 override 方法,即使 gtk.Dialog 已经实现了 buildable界面。

于 2009-01-05T01:56:06.743 回答