Göremediğim çok tuhaf bir kapsam belirleme hatası. Bir güncelleyici fonksiyonunun içinde, ben .../bir şey w yardımıyla iç içe bir yardımcı işlevi vardır:pygtk: kapsamı tamamlamadan önce atanan serbest değişken
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)
Bu arada bir çalışır, ancak güncelleme() işlevi çok fazla çalışıyorsa, sonunda alıyorum:
for eb in es:
NameError: free variable 'es' referenced before assignment in enclosing scope
Buna neden oluyor? Bu işlevler çağrılmadan önce kesinlikle atanır. Bu doğru değil mi? Önceden yaratılmış bir satır için ene(), yeni bir tane oluşturulurken çağrılır ve es
'un üzerine yazılır mı?
hehe, doğru. Bunu yapmanın daha akılcı bir yolunun olduğunu fark ettim - bu satırların çoğunu çıkarmak ve takmak yerine, bunlardan sadece bir set oluşturup bunların içindeki widget'ları değiştiriyorum. Bir not: Yine de: "es" değerini kullanıcı verileri olarak ene ve lne işlevlerine geçirmeyi denedim. Ne olur ki artık NameError'a sahip değilim, ancak widgetlar hiç de vurgulanmayacaktı. Sisten hala bir yerlerde kayboluyordu. Eğer bu tekrar gelirse, sınıf fikrini deneyeceğim. – Claudiu
daha da iyi bir yol - bir VBox kullanın, satır başına bir olay kutusu yerleştirin ve daha sonra – Claudiu
sütunlarını hizalamak için bir boyut grubu kullanın, bu diğer durumlarda da oldu. Python 2.5 tuhaflık olduğunu düşünüyorum. hala bir cevap bulamadı – Claudiu