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

时间:2012-04-23 22:25:24

标签: 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()

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

1 个答案:

答案 0 :(得分:5)

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

在C中,您是否持有参考资料绝不存在任何疑问;如果您创建了窗口小部件但尚未将其添加到容器中,或者在窗口小部件上调用g_object_ref(),则您有一个引用。如果不是,不是。

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