我正在为 GTK3 程序创建一个插件。该插件可以在运行时启用或禁用。启用后,它应该在主机程序的给定区域(GtkBin)中填充其 GUI。禁用时,它应将自身从该区域中移除。
这个简单的程序描述了用法:
#!/usr/bin/python2
from gi.repository import Gtk
window = Gtk.Window()
class Plugin(object):
def __init__(self, host):
assert(isinstance(host, Gtk.Bin))
self.host = host
self.guest = None
def enable(self):
box = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
for x in range(10):
box.add(Gtk.Button("Button {}".format(x)))
self.guest = box
self.host.add(self.guest)
def disable(self):
self.host.remove(self.guest)
# self.guest.destroy() # is this better?
self.guest = None
plugin = Plugin(window)
plugin.enable()
#plugin.disable()
window.connect("destroy", Gtk.main_quit)
window.show_all()
Gtk.main()
我希望当插件被禁用时,它添加到主机的所有小部件都应该被正确处理。
我发现这个问题非常相似:GTK 中的 Free object/widget? 它提出gtk_container_remove
和gtk_widget_destroy
。但我很担心:
考虑
gtk_container_remove
。它删除了宿主容器的直接子容器。就我而言,孩子也是许多其他小部件的组合,它们可能相互引用。删除直接子元素是否足以处理所有小部件?考虑
gtk_widget_destroy
。它是递归的,似乎是我需要的,但也似乎太残酷了。手动销毁小部件真的有必要吗?把这项工作留给参考柜台会更好吗?
我愿意听听这个案例的“最佳实践”。