![如何在对话框中访问父窗口](https://linux22.com/image/823622/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%AF%B9%E8%AF%9D%E6%A1%86%E4%B8%AD%E8%AE%BF%E9%97%AE%E7%88%B6%E7%AA%97%E5%8F%A3.png)
我正在使用 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!