web-dev-qa-db-fra.com

Comment accéder à la fenêtre parent dans la boîte de dialogue

J'utilise rapidement et j'ai créé la fenêtre principale et une boîte de dialogue. Dans la fenêtre principale, je définis l'accès à la base de données (u1db) dans la méthode finish_initializing (self.db = ...). Après une action, j'ouvre une boîte de dialogue où j'ai besoin d'accéder à la base de données.

J'ai pensé que je pouvais utiliser self.get_parent () dans la boîte de dialogue pour obtenir l'instance de la fenêtre principale et accéder à la base de données, mais la valeur de retour de get_parent () est None.

Ma question est, comment puis-je accéder à l'instance de la fenêtre parent dans la boîte de dialogue ou peut-être où dois-je placer l'instance de l'encapsuleur de base de données?

Code abrégé:

# 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_= "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"

Résultat:

__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

C'est assez simple, passez simplement votre instance de fenêtre principale dans votre boîte de dialogue :-).

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

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