बहुत विचित्र स्कोपिंग त्रुटि जो मैं भी नहीं देख सकता। एक अपडेटर समारोह के अंदर, मैं करने के लिए ... मदद w/कुछ एक नेस्टेड सहायक समारोह है:pygtk: स्कोप संलग्न करने में असाइनमेंट से पहले संदर्भित मुक्त चर
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)
यह एक समय में एक बार काम करता है, लेकिन अद्यतन() फ़ंक्शन बहुत अधिक चलता है, मैं अंत में मिलता है:
for eb in es:
NameError: free variable 'es' referenced before assignment in enclosing scope
इसका कारण क्या है? es उन कार्यों को कभी भी बुलाए जाने से पहले निश्चित रूप से असाइन किया जाता है। क्या यह सही नहीं है? क्या कुछ विचित्र बात हो रही है, जहां किसी कारण से पूर्व निर्मित पंक्ति के लिए ene() को नया बनाया जा रहा है, और es
पर बंद हो गया है?
हे, सच। मुझे वास्तव में एहसास हुआ कि मेरे पास ऐसा करने का एक सुरक्षित तरीका है - इन पंक्तियों को हटाने और जोड़ने के बजाय, मैं बस उनमें से एक सेट बना देता हूं और उनके अंदर विजेट बदलता हूं। एक नोट, यद्यपि: मैंने उन ese और lne कार्यों में उपयोगकर्ता डेटा के रूप में "es" को पारित करने का प्रयास किया। मुझे खुशी है कि अब मुझे नेमरर नहीं मिला है, लेकिन विजेट बिल्कुल हाइलाइट नहीं होंगे। कुछ अभी भी खो गया था। यदि यह फिर से आता है तो मैं वर्ग विचार का प्रयास करूंगा। – Claudiu
और भी बेहतर तरीका - एक वीबॉक्स का उपयोग करें, प्रति पंक्ति एक ईवेंट बॉक्स डालें, और फिर कॉलम – Claudiu
कॉलम को संरेखित करने के लिए आकार समूह का उपयोग करें हाँ यह अन्य स्थितियों में भी हुआ। मुझे लगता है कि पाइथन 2.5 अजीबता है। अभी भी कोई जवाब नहीं मिला – Claudiu