Python 自定义Gtk小部件销毁后如何执行清理?

Python 自定义Gtk小部件销毁后如何执行清理?,python,python-3.x,gtk,gtk3,pygobject,Python,Python 3.x,Gtk,Gtk3,Pygobject,我有一个自定义的Gtk小部件,如下面的代码示例中定义的MyWidget: import gc import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class MyWidget(Gtk.Button): def __init__(self, **kwargs): super().__init__(**kwargs) self.x = 5 def __d

我有一个自定义的Gtk小部件,如下面的代码示例中定义的
MyWidget

import gc
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk


class MyWidget(Gtk.Button):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.x = 5

    def __del__(self):
        print('__del__   :', self, getattr(self, 'x', None))

    def do_destroy(self):
        print('do_destroy:', self, getattr(self, 'x', None))
        # clean up self.x


widget = MyWidget()

del widget
gc.collect()
销毁小部件后,我需要进行一些清理(我的自定义小部件是一个打开对话框窗口的按钮,在销毁按钮后,如果它仍然存在,我想销毁它创建的对话框窗口)

我的问题是,运行上面的代码,我得到了输出:

__del__   : <__main__.MyWidget object at 0x105340678 (__main__+MyWidget at 0x7fc1bc0bc340)> 5
do_destroy: <__main__.MyWidget object at 0x1053406c0 (__main__+MyWidget at 0x7fc1bc0bc340)> None
__del__   : <__main__.MyWidget object at 0x1053406c0 (__main__+MyWidget at 0x7fc1bc0bc340)> None
\uuu del\uuu:5
你破坏了吗:没有
__德尔:没有
我的理解是,在PyGObject中,所有Python对象都只是底层GObject的包装器。因此,我对上述输出的推理是这样的。
小部件
包装器即将被垃圾收集,因此调用了
\uuu del\uuu()
方法。在
小部件
包装器被垃圾收集后,底层小部件似乎准备被销毁,因为随后调用了
do_destroy()
方法。但是调用
do_destroy()
时,将
self
设置为与原始
widget
对象不同的新包装器对象,并且
self.x
不再存在。然后调用新包装的
\uu del\uu()

我的问题是,我应该把“
self.x
清理逻辑”放在哪里?如果有人知道,PyGObject如何创建新的包装器对象(它似乎没有调用
\uuuuuunew\uuuuu()
\uuuu init\uuuuuu()

我将清理逻辑放在
do_destroy()
中的另一个问题是,
do_destroy()
似乎在每次调用小部件的
destroy()
方法时都会被调用,这可以多次执行