Python 自定义Gtk小部件销毁后如何执行清理?
我有一个自定义的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
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()
方法时都会被调用,这可以多次执行