2

我正在使用 GTK3 在 python 中做一个程序。我需要根据用户需要更改 GUI 界面。如果我有一个添加了 Gtk.Box 的窗口,然后在框中放置标签和文本条目之类的内容,然后在需要更改界面时删除 Box,是否会删除标签和文本条目在记忆中?我对 Python 最感兴趣,但也想学习 C。C的答案是否不同?

如果它没有自动销毁 Gtk.Box,那么这意味着不断跟踪盒子中的每个小部件,并且需要为每个小部件调用一个 widget.destroy()。好像有点浪费。

谢谢,

纳尼

>>> 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() 是否也会破坏标签对象?

4

1 回答 1

6

当你销毁一个容器时,里面的小部件的引用计数会减少。如果一个小部件的引用计数下降到零,它就会被销毁。因此,如果您的代码中没有任何额外的引用,那么当您销毁容器时,小部件将被销毁。

在 C 中,你是否持有一个引用是毫无疑问的。如果您创建了小部件并且尚未将其添加到容器中,或者g_object_ref()在小部件上调用,那么您有一个参考。如果不是,则不是。

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

于 2012-04-24T20:16:51.080 回答