Ich erstelle ein Plug-in für ein GTK3-Programm. Dieses Plug-in kann zur Laufzeit aktiviert oder deaktiviert werden. Wenn es aktiviert ist, sollte es die GUI in einem bestimmten Bereich (einem GtkBin) im Host-Programm auffüllen. Wenn es deaktiviert ist, sollte es sich aus diesem Bereich entfernen.Wie GtkWidget in Python, GTK3 und PyGObject zu entsorgen?
Dieses einfache Programm stellt die Nutzung:
#!/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()
Ich wünsche, dass, wenn die Plug-in deaktiviert ist, alle Widgets es den Host hinzugefügt sollte ordnungsgemäß entsorgt werden.
Ich habe diese Frage ziemlich ähnlich: Free object/widget in GTK? Es wurde vorgeschlagen, gtk_container_remove
und gtk_widget_destroy
. Aber ich mache mir Sorgen:
Betrachten
gtk_container_remove
. Es entfernt das direkte Kind des Host-Containers. In meinem Fall ist das Kind auch eine Zusammensetzung von vielen anderen Widgets und sie können sich gegenseitig referenzieren. Wird das direkte Kind genug entfernen, damit alle Widgets entsorgt werden können?Betrachten
gtk_widget_destroy
. Es ist rekursiv und scheint zu sein, was ich brauche, scheint aber auch zu brutal. Ist das wirklich notwendig, um ein Widget manuell zu zerstören? Wäre es besser, diesen Job dem Referenzzähler zu überlassen?
Ich bin bereit, die "Best Practice" für diesen Fall zu hören.
Es dauert ziemlich lange, um zu verstehen, warum man sich nicht auf GC verlässt, um andere Ressourcen als Speicher wiederzugewinnen. Meine ursprüngliche Frage impliziert eine Art "Eigentums" -Beziehung, in der das Fenster seine Kinder besitzt. Der Destruktor von 'QObject' in Qt ist ein gutes Beispiel. – wks