2009-08-07 5 views
6

बहुत विचित्र स्कोपिंग त्रुटि जो मैं भी नहीं देख सकता। एक अपडेटर समारोह के अंदर, मैं करने के लिए ... मदद 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 पर बंद हो गया है?

उत्तर

4

वास्तव में बहुत ही रहस्यमय - आंतरिक कार्यों के नीचे से बंद होने की तरह लग रहा है। आश्चर्य है कि अगर यह से संबंधित है pygtk ऐसे कॉलबैक फ़ंक्शन रखता है (मैं इसके आंतरिक से परिचित नहीं हूं)। इसके लिए जांच करने का प्रयास करने के लिए - क्या होता है यदि आप attach_row के अंत में वैश्विक सूची में एनई और लेन को जोड़ते हैं, तो यह सुनिश्चित करने के लिए कि वे कहीं भी "सामान्य" हो जाते हैं ताकि उनका बंद रहता है - क्या समस्या बनी रहती है उस मामले में?

यदि ऐसा होता है, तो मुझे समस्या को केवल रहस्यमय और समझौते के रूप में स्वीकार करना होगा, एक कामकाज के रूप में, कॉलबेल का उपयोग जो उनके राज्य को एक स्पष्ट तरीके से पकड़ता है (मैं दो बाध्य तरीकों का सुझाव दूंगा एक वर्ग के उदाहरण के बाद से, वे अपने राज्य को साझा करते हैं, लेकिन __call__ के साथ एक वर्ग के दो उदाहरण और राज्य को सेट करने और __init__ में ईवेंट बॉक्स की सूची निश्चित रूप से भी उचित है - दो अलग-अलग वर्ग होने के कारण आईएमएचओ थोड़ा सा होगा अतिशयोक्ति ;-)।

+0

हे, सच। मुझे वास्तव में एहसास हुआ कि मेरे पास ऐसा करने का एक सुरक्षित तरीका है - इन पंक्तियों को हटाने और जोड़ने के बजाय, मैं बस उनमें से एक सेट बना देता हूं और उनके अंदर विजेट बदलता हूं। एक नोट, यद्यपि: मैंने उन ese और lne कार्यों में उपयोगकर्ता डेटा के रूप में "es" को पारित करने का प्रयास किया। मुझे खुशी है कि अब मुझे नेमरर नहीं मिला है, लेकिन विजेट बिल्कुल हाइलाइट नहीं होंगे। कुछ अभी भी खो गया था। यदि यह फिर से आता है तो मैं वर्ग विचार का प्रयास करूंगा। – Claudiu

+0

और भी बेहतर तरीका - एक वीबॉक्स का उपयोग करें, प्रति पंक्ति एक ईवेंट बॉक्स डालें, और फिर कॉलम – Claudiu

+0

कॉलम को संरेखित करने के लिए आकार समूह का उपयोग करें हाँ यह अन्य स्थितियों में भी हुआ। मुझे लगता है कि पाइथन 2.5 अजीबता है। अभी भी कोई जवाब नहीं मिला – Claudiu

0

विश्व स्तर पर या एक उच्च दायरे में पर्याप्त अंक एक टिप्पणी (सिर्फ पंजीकृत) के रूप में इस छोड़ने के लिए नहीं है ...

  • नहीं 'तों' चर?
  • attach_row भी एक नेस्टेड फ़ंक्शन नहीं है?
  • एनई या लेन कार्यों में लूप लाइन के लिए नाम त्रुटि अपवाद बिंदु?

एक संभव, लेकिन icky, कामकाज एनई और लेन वर्गों को बनाने के लिए हो सकता है जो त्वरित रूप से __call __() विधि के माध्यम से कार्यों के रूप में तत्काल और कॉल करने योग्य होते हैं।

संबंधित मुद्दे