代码之家  ›  专栏  ›  技术社区  ›  Dimitri Tcaciuc

生成器、容器子类和绑定子小部件

  •  4
  • Dimitri Tcaciuc  · 技术社区  · 17 年前

    #!/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)
    

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

    1 回复  |  直到 17 年前
        1
  •  5
  •   Dimitri Tcaciuc    17 年前

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

    执行上述操作的一种方法是重写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继承,则不会调用重写方法,即使gtk.Dialog已经实现了可构建接口。

    推荐文章