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インスタンス変数にバインドする方法を理解しようとしています。

私が考えることができる1つの安価な代替手段は、次のようなダイアログウィジェットを取得した後に追加のメソッドを呼び出すことです。

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

しかし、それはかなり厄介なようです。誰かがこれをすでに解決したか、それを実行する方法についてより良いアイデアを持っていますか?

ありがとう、

4

1 に答える 1

5

わかりました、私は自分の質問に答えたと思います。

上記を行う 1 つの方法は、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

注意すべきことの 1 つは、何らかの理由で (少なくとも私にとっては、pygtk 2.12 で)、gtk.Buildable から明示的に継承しない場合、gtk.Dialog が既にビルド可能オブジェクトを実装しているにもかかわらず、オーバーライド メソッドが呼び出されないことです。インターフェース。

于 2009-01-05T01:56:06.743 に答える