gtk.Builder、コンテナサブクラス、バインディング子ウィジェット
-
03-07-2019 - |
質問
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)
しかし、それはかなり厄介なようです。誰かがすでにこれを解決したか、それを行う方法についてより良いアイデアを持っていますか?
ありがとう、
解決
さて、私は自分の質問に答えたと思います。
上記の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と考えられていることですビルド可能なインターフェースを実装します。
所属していません StackOverflow