Newsgroup: it.comp.lang
Titolo: [PYTHON] Libglade e gestione finestre multiple

Sto scrivendo una piccola applicazione in Python, e per l'interfaccia ho
deciso di affidarmi all'accoppiata glade-libglade.
Ho perň un problema, non ho ben capito come fare per gestire piů
finestre, la mia applicazione si compone di due finestre, una
principale, ed un'altra che viene eventualmente richiamata tramite una
voce in un menu.
Attualmente ho risolto cosě, con glade ho fatto in modo che la seconda
finestra sia inizialmente 'hide', poi quando tramite la callback
relativa alla chiamata nel menů do il comando window2.show().
Il sistema funziona, ma solo la prima volta, se la chiudo e tento di
riaprirla mi si presenta una finestra tutta nera.
Come va gestita correttamente questa situazione?
Faccio presente che la funzione GladeXML la utilizzo una sola volta e mi
carico tutta l'interfaccia in un sol colpo.
-- 
 |\ |       <-> 
http://digilander.libero.it/nemesis2001/
 | \|emesis <->      "War, war never change us..."
 

 Come va gestita correttamente questa situazione?
def on_window_seconda_destroy(self, data, data2):
    self["window_seconda"].hide()
    return 1
Devi nasconderla e poi fare return 1 in pratica, altrimenti gtk passa il
segnale all'handler principale che distrugge la memoria allocata dalla
finestra, quindi non la puoi piu` richiamare.
La sintassi sopra e` una scorciatoia che uso io per scrivere meno
codice, implementata cosi`:
def __getitem__(self,key):
    return self.gui.get_widget(key)
Io uso una classe per la GUI, e quelle sono tutti metodi della classe.
Se usi programmazione a funzioni modifica la riga hide.
Bye.

 finestra, quindi non la puoi piu` richiamare.
Allora, ho usato il metodo da te descritto ma non funziona. :-/
Ho collegato il segnale e aggiunto la funzione
def on_window2_destroy(obj)
    print "win2 destroy"
    window2.hide()
    return 1
quando chiudo la finestra in effetti il metodo viene richiamato infatti
entra in azione il print, però se vado a riaprire la finestra ottengo il
seguente errore :
Gtk-CRITICAL **: file gtkstyle.c: line 513 (gtk_style_attach): assertion
`style != NULL' failed.
Gtk-CRITICAL **: file gtkstyle.c: line 1134 (gtk_style_set_background):
assertion `style != NULL' failed.
Gtk-CRITICAL **: file gtkstyle.c: line 3613 (gtk_paint_flat_box):
assertion `style != NULL' failed.
E si apre una finestra tutta nera e piccola :-/


 Ho collegato il segnale e aggiunto la funzione
Forse e` meglio se posti un po' di codice. :)
Non e` che hai altri segnali collegati alla chiusura?

 Non e` che hai altri segnali collegati alla chiusura?
No, gli unici segnali dalla window2 che collego sono lo "show" ed il
"destroy" ed il "destroy" è collegato alla funzione
"on_window2_destroy", il metodo viene richiamato correttamente (me ne
accorgo grazie al print) ma pare che non faccia quello che dovrebbe
fare.


 Come va gestita correttamente questa situazione?
Ho finalmente risolto :-)
Su segnalazione di un utente di comp.lang.python ho consultato la
seguente faq su PyGtk:
http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq10.006.htp
Dove viene suggerito di non collegare il segnale "destroy" ma bensì il
"delete_event", infatti il primo non può essere scavalcato neanche con
il return 1 mentre il delete_event si, e quindi tutto funziona :-)
