Errore di scoping molto bizzarro che non riesco nemmeno a vedere. All'interno di una funzione di aggiornamento, ho una funzione di supporto nidificato per ... help w/qualcosa:pygtk: variabile gratuita di riferimento prima dell'assegnazione nel campo di applicazione
def attach_row(ws,r1,r2):
es = []
for i,w in enumerate(ws):
eb = gtk.EventBox()
a = gtk.Alignment(xalign=0.0,yalign=0.5)
a.add(w)
eb.add(a)
eb.set_style(self.rowStyle.copy())
es.append(eb)
self.table.attach(eb, i, i+1, r1, r2,
xoptions=gtk.EXPAND|gtk.FILL,
yoptions=gtk.SHRINK)
def ene(_,ev):
for eb in es:
eb.set_state(gtk.STATE_PRELIGHT)
def lne(_,ev):
for eb in es:
eb.set_state(gtk.STATE_NORMAL)
for eb in es:
eb.connect('enter-notify-event', ene)
eb.connect('leave-notify-event', lne)
questo funziona una volta ogni tanto, ma se la funzione di aggiornamento() corre troppo, alla fine ho capito:
for eb in es:
NameError: free variable 'es' referenced before assignment in enclosing scope
cosa sta causando questo? è sicuramente assegnato prima che queste funzioni vengano mai chiamate. Non è giusto? Accade qualcosa di bizzarro dove per qualche motivo viene chiamato l'ene() per una riga creata in precedenza mentre viene creato il nuovo, e viene sovrascritto lo spazio chiuso su es
?
hehe, vero. In realtà mi sono reso conto di avere un modo più sano per farlo: invece di rimuovere e allegare molte di queste righe, creo solo un set di esse e cambio i widget al loro interno. Una nota, però: ho provato a passare "es" come dati utente a quelle funzioni ene e lne. Quello che è successo è che non ho più avuto l'errore NameError, ma i widget non evidenziavano affatto. Qualcosa si stava ancora perdendo da qualche parte. Se questo torna di nuovo proverò l'idea di classe. – Claudiu
ancora meglio - usa un VBox, metti un box per evento per riga, e poi usa un sizegroup per allineare le colonne – Claudiu
sì, questo è accaduto anche in altre situazioni. penso sia la stranezza di Python 2.5. non ho mai trovato una risposta – Claudiu