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の無料オブジェクト/ウィジェット?提案gtk_container_remove
してgtk_widget_destroy
。しかし、私は心配しています:
考えてみてください
gtk_container_remove
。ホストコンテナの直接の子を削除します。私の場合、子は他の多くのウィジェットの構成でもあり、それらは相互に参照している可能性があります。すべてのウィジェットを破棄するのに十分な直接の子を削除しますか?考えてみてください
gtk_widget_destroy
。それは再帰的で、私が必要としているもののように見えますが、あまりにも残忍なようです。これはウィジェットを手動で破棄するために本当に必要ですか?その仕事を参照カウンターに任せたほうがいいでしょうか?
この場合の「ベストプラクティス」を喜んで聞きます。