删除容器会破坏GTK内存中的小部件

nar*_*nie 2 python gtk3

我正在使用GTK3在python中执行一个程序.我需要根据用户的需要更改GUI界面.如果我有一个窗口,我已经添加了一个Gtk.Box,然后在框中添加类似标签和文本条目的东西,然后当需要更改界面时,删除Box,是否删除标签和文本条目在记忆中?我对Python最感兴趣,但也想学习C语言.C的答案有何不同?

如果它不会自动销毁Gtk.Box,那么这意味着要保持对框中每个小部件的持续跟踪,并且需要为每个小部件调用widget.destroy().似乎有点浪费.

谢谢,

Narnie

>>> import gtk
>>> win = gtk.Window()
>>> vbox = gtk.VBox()
>>> win.add(vbox)
>>> label = gtk.Label("Hello, everybody!")
>>> vbox.pack_start(label, True, True, 0)
>>> win.show_all()
>>> vbox.destroy()
Run Code Online (Sandbox Code Playgroud)

vbox.destroy()是否也会破坏标签对象?

pto*_*ato 6

当您销毁容器时,内部的小部件会减少其引用计数.如果窗口小部件的引用计数降为零,则会将其销毁.因此,如果您没有在代码中保留任何额外的引用,则在销毁容器时将销毁小部件.

在C中,你是否持有一个参考,从来没有任何问题; 如果您创建了窗口小部件并且尚未将其添加到容器中,或者g_object_ref()在窗口小部件上调用,则您有一个引用.如果没有,不是.

在Python中,事情变得更复杂.如果窗口小部件绑定到Python解释器中的名称,则可能添加了额外的引用.如果你是在像IPython这样的解释器中以交互方式做事情,它会跟踪旧输入,那么可能有几个引用.但是你不需要在Python中担心这个问题; 当对象不再可访问时,垃圾收集器将删除引用,即使在销毁容器时它没有被销毁.