Jak połączyć się z sygnałem GObject w Pythonie, bez utrzymywania odniesienia do łącznika?
Problem polega zasadniczo na tym, że w gobjectach pythona i powiązaniach gtk. Załóżmy, że mamy klasę, która wiąże się z sygnałem po skonstruowaniu:
class ClipboardMonitor (object):
def __init__(self):
clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
clip.connect("owner-change", self._clipboard_changed)
Problem polega na tym, żeżadna instancja ClipboardMonitor nigdy nie umrze. Schowek gtk jest obiektem obejmującym całą aplikację, a połączenie z nim powoduje odwołanie do obiektu, ponieważ używamy wywołania zwrotnegoself._clipboard_changed
.
Zastanawiam się, jak to obejść, używając słabych referencji (moduł weakref), ale muszę jeszcze opracować plan. Każdy ma pomysł, jak przekazać wywołanie zwrotne do rejestracji sygnału i czy zachowuje się jak słaba referencja (jeśli wywołanie zwrotne sygnału jest wywoływane, gdy instancja ClipboardMonitor jest poza zakresem, powinna to być operacja bezoperacyjna).
Dodanie:Zwrot niezależnie od GObject lub GTK +:
Jak udostępnić metodę wywołania zwrotnego nieprzezroczystemu obiektowi z semantyką słabych wartości? Jeśli łączący się obiekt wykracza poza zakres, powinien zostać usunięty, a wywołanie zwrotne powinno działać jako operacja zerowa; łącznik nie powinien zawierać odniesienia do złącza.
Aby wyjaśnić: wyraźnie chcę uniknąć wywoływania metody „destruktor / finalizator”