2009-01-04 128 views
4

我想在gtk.Builder定义文件中使用自定义容器窗口小部件。至于那些实例窗口小部件,它的伟大工程: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) 

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

谢谢,

回答

5

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

完成上述操作的一种方法是重写gtk.Buildable的parser_finished(),它可以访问创建类实例本身的构建器对象。整个.xml文件加载后该方法被调用,所以所有的额外部件,我们可能希望得到的是已经存在保持和intialized:

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已经实现了可构建接口。

+0

+1这太棒了!我现在明白你在做什么。 – 2009-01-05 02:00:07

相关问题