2009-08-07 55 views
6

非常奇怪的范围错误,我甚至看不到。内部的更新功能的,我有一个嵌套的辅助函数来...帮助瓦特/某事: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拥有这样的回调函数(我不熟悉它的内部)。试图探索这个问题 - 如果您还将ene和lne添加到attach_row末尾的全局列表中,只是为了确保它们在某个地方“正常”存在,以便它们的关闭能够存活,会发生什么情况 - 问题是否会持续存在那种情况?

如果确实如此,那么我不得不承认这个问题太神秘了,并且同意以前的回答,作为一种解决方法,使用可调参数来保持其状态更清晰(我建议使用两个绑定方法的一个类实例,因为它们共享它们的状态,但是具有__call__的一个类的两个实例并且接收到要设置的状态并且其__init__中的事件框列表当然也是合理的 - 具有两个单独的类恕我直言将是轻微的夸张;-)。

+0

hehe,true。我实际上意识到我有一个更好的方法来做到这一点 - 而不是删除和附加很多这些行,我只是创建一组并更改其中的小部件。 尽管如此:我尝试将“es”作为用户数据传递给这些ene和lne函数。发生什么是我不再有NameError,但小工具根本不会突出显示。 SOmething仍然在某处丢失。 如果这再次出现,我会尝试类的想法。 – Claudiu 2009-08-07 06:08:44

+0

甚至更​​好的方法 - 使用VBox,每行放一个事件框,然后使用sizegroup来对齐列 – Claudiu 2009-08-07 07:07:01

+0

是的,这是在其他情况下发生的。我认为是蟒蛇2.5怪异。仍然没有找到答案 – Claudiu 2010-11-29 21:39:55

0

没有足够的点离开这个作为注释(刚注册)...

  • 没有“ES”全局变量或更高的范围是什么?
  • attach_row不是嵌套函数吗?
  • NameError异常指向循环线在ene或lne函数?

一个可能的,但icky的解决方法可能是通过__call __()方法将实例化并可作为函数调用的ene和lne类。

相关问题