我什至看不到非常奇怪的范围错误。在更新程序功能内部,我有一个嵌套的帮助程序功能,可以帮助您:

    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)

这偶尔会起作用,但是如果update()函数运行太多,我最终会得到:
    for eb in es:
NameError: free variable 'es' referenced before assignment in enclosing scope

是什么原因造成的?在调用这些函数之前,肯定会分配es。是不是是否发生某种奇怪的事情,由于某种原因,在创建新行时调用先前创建的行的ene()并覆盖了es上的封闭行吗?

最佳答案

确实确实很神秘-看起来封闭的功能从内部功能中消失了。想知道这是否与pygtk如何保存此类回调函数有关(我不熟悉其内部结构)。为了对此进行探究-如果在attach_row的末尾还将ene和lne附加到全局列表,会发生什么情况,只是确保将它们“正常”保存在某个地方,以便它们的关闭幸存下来,问题是否仍然存在?那样的话

如果是这样,那么我必须承认问题只是太神秘了,并同意先前的答案,即作为变通方法,使用以更清晰的方式保持其状态的可调用对象(我建议使用一个类实例的两个绑定(bind)方法,因为它们共享状态,但是具有__call__的单个类的两个实例并接收要设置的状态以及__init__中的事件框列表肯定也是合理的-具有两个单独的类IMHO会有点夸张;-) 。

关于python - pygtk : free variable referenced before assignment in enclosing scope,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1242593/

10-13 01:18