如何在对话框中访问父窗口

如何在对话框中访问父窗口

我正在使用 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

答案1

这很简单,只需将主窗口实例传递给对话框:-)。

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

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

相关内容