web-dev-qa-db-ja.com

ダイアログで親ウィンドウにアクセスする方法

Quicklyを使ってメインウィンドウとダイアログを作成しました。メインウィンドウで、finish_initializingメソッド(self.db = ...)でデータベース(u1db)へのアクセスを設定しています。アクションの後、データベースにアクセスする必要があるダイアログを開きます。

ダイアログでself.get_parent()を使用してメインウィンドウのインスタンスを取得し、データベースにアクセスできると思いましたが、get_parent()の戻り値はNoneです。

私の質問は、ダイアログで親ウィンドウのインスタンスにどのようにアクセスできるか、またはデータベースラッパーのインスタンスをどこに配置する必要があるかです。

短縮されたコード:

# GuitestWindow.py
class GuitestWindow(Window):

    def finish_initializing(self, builder):
        ...
        self.db = u1db.open(
            db_path,
            create=True
        )


    def on_addaccountbutton_clicked(self, widget):
        dialog = NewAccountDialog.NewAccountDialog(db=self.db)
        result = dialog.run()
        dialog.hide()



# NewAccountDialog.py
class NewAccountDialog(Gtk.Dialog):
    __gtype_name__ = "NewAccountDialog"

    def __new__(cls, *args, **kwargs):
        print "__new__: %s : %s" % (args, kwargs)
        builder = get_builder('NewAccountDialog')
        new_object = builder.get_object('new_account_dialog')
        new_object.finish_initializing(builder)
        print "__new__ end"
        return new_object


    def __init__(self, *args, **kwargs):
        print "__init__: %s : %s" % (args, kwargs)
        self.db = kwargs.get('db')
        super(NewAccountDialog, self).__init__(*args, **kwargs)
        print "__init__ end"

結果:

__new__: () : {'db': <u1db.backends.sqlite_backend.SQLitePartialExpandDatabase object at 0x1884f50>}
__init__: () : {}
__init__ end
__new__ end
__init__: () : {'db': <u1db.backends.sqlite_backend.SQLitePartialExpandDatabase object at 0x1884f50>}
__init__ end
2
Bruce

これは非常に簡単です。メインウィンドウのインスタンスをダイアログに渡します:-)。

    # ...
    dialog = NewAccountDialog.NewAccountDialog(self)
    # ...

class NewAccountDialog(Gtk.Dialog):
    def __init__(self, main):
        self.main = main
        # I can manage main now!
1
Timo