1

Windows 7x64 Python2.7

我希望将Python线程解决方案中的词法闭包应用于我的代码。附加阅读for 循环和词法环境中的闭包

我浏览了一个图像列表、缩略图对并显示缩略图,单击标签后,它应该显示一个新的 TopLevel,其中包含全尺寸图像。

实际发生的是,它只显示了 ImagePairs 的最后一个图像。环顾四周,我发现了我在上面发布的那个帖子,但我不确定如何将它应用于我的情况。

            row, col = 0, 0
            #create a frame for the row
            rowFrame = Frame(master)
            for image, thumb in ImagePairs:
                curLbl = Label(rowFrame, image=thumb)
                curLbl.grid(row=0, column=col, sticky='news')

                curLbl.bind('<Button-1>', lambda e:self.popImage(image))  #or curLbl.image

                col += 1
                if col >= 3:
                    rowFrame.grid(row=row)
                    #create a new frame, for the next row
                    rowFrame = Frame(master)
                    col = 0
                    row += 1

我想制作一个像

def func(img=img):
   return img

并将其插入到 grid() 和 bind() 之间的空间中,但随后出现丢失图像的错误。如何修改我的代码以适应它?

4

1 回答 1

4

您可以将默认值添加image = image到 lambda 本身:

for image, thumb in ImagePairs:
            curLbl = Label(rowFrame, image=thumb)
            curLbl.grid(row=0, column=col, sticky='news')
            curLbl.bind('<Button-1>', lambda e, image = image:self.popImage(image))  #or curLbl.image

func如果您使用默认值而image不是img

def func(e, img = image):
    self.popImage(img)

要记住的关键是在定义 lambda(或函数)时绑定了默认

因此,每次通过循环时,都会使用自己的局部变量定义一个新的 lambda ,并在定义时image使用自己的默认值image绑定。因此,当稍后调用 lambda 时,将image访问该权限。

将其与未提供默认值的情况进行对比:image不再是 lambda 的局部变量。当调用 lambda 时,Python 会在封闭范围内寻找它。但到那时,for 循环完成,并且image在封闭范围内设置为ImagePairs. 这就是为什么无论你按下什么按钮,你都会得到相同的最后一张图像:所有的 lambdas 都在访问同一个变量的值image

于 2012-04-13T20:55:54.333 回答