[Python] weakref ... troppo deboli!...

Marco Giusti marco.giusti a gmail.com
Ven 28 Maggio 2010 12:19:12 CEST


On Fri, May 28, 2010 at 10:25:51AM +0200, Alessandro Dentella wrote:
> Ciao a tutti,
[...]
> Quando la finestra risulta incancellabile tramite il bottone kill, anche la
> cancellazione tramite window-manager fallisce (AttributeError: G objectc has
> no attribute 'title'). È come se la istanza 'g' sia stata resa monca nonostante
> esista ancora una finestra con una callback attiva che referenzia (in senso
> forte) l'istanza stessa ed il suo metodo 'delete_event_cb'. Chiamo 'monca'
> questa istanza nel senso che:
> 
>   * la weakref non la vede più
>   * la callback capisce che è una istanza di 'G' ma non ne vede l'attributo
>     di istanza 'title'::
> 
>       Traceback (most recent call last):
> 	File "testd2_win.py", line 39, in clicked_cb
> 	  if self.title:
>       AttributeError: 'G' object has no attribute 'title'
>   
> Conto su un vostro input per non andare in corto...

Vediamo un po' tutti i possibili problemi che possono sorgere:

1. il metodo `delete_event_cb` elimina il riferimento alla finestra ma
il metodo può essere ancora chiamato dal padre e non essendoci più
riferimenti a `self.w`...

2. gli unici riferimenti che hai agli oggetti `G` sono dei riferimenti
deboli. a questo punto credo che tu debba andare a vedere come i
riferimenti deboli siano implementati in pygtk. non sono molto preparato
qui ma sicuramente il problema è questo. Accanto a `self.windows`
affianca un'altra lista: `self.objects` con riferimenti forti, vedrai
che a questo punti non hai più di questi problemi.

per quanto ne so' la gestione dei riferimenti in pygtk è pensata per, ad
eccezione di casi particolari, potersene dimenticare. nel momento in cui
non ci sono più riferimenti python ad un oggetto gobject, questo viene
deallocato.

ps. ti allego la versione modificata.

pps. la gerarchia che crei è con soli due livelli, perché allora non usi
due classi distinte? ti allego la versione modificata

ciao
m.

-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        test_new.py
Tipo:        text/x-python
Dimensione:  1834 bytes
Descrizione: non disponibile
Url:         http://lists.python.it/pipermail/python/attachments/20100528/25540dc0/attachment.py 
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        testd2_win.py
Tipo:        text/x-python
Dimensione:  1757 bytes
Descrizione: non disponibile
Url:         http://lists.python.it/pipermail/python/attachments/20100528/25540dc0/attachment-0001.py 


Maggiori informazioni sulla lista Python