Python TkInter-为不确定数量的图像分配标记

Python TkInter-为不确定数量的图像分配标记,python,tkinter,Python,Tkinter,我正在开发一个应用程序,它可以显示一系列墙纸图像,并允许用户选择一个作为应用程序的背景 应用程序读入一个目录并显示该目录中的所有.JPG图像。因此,它需要能够允许用户单击不确定长度的选项列表中的任何选项 问题是:单击列表中的任何墙纸只会传入选项以更改为列表中最后一张墙纸(即循环变量迭代,我希望调用该方法以在我分配标记的迭代中捕获循环变量的值) 以下是代码的相关部分: for i in range(0,(howManyWalls-1)): #Update position if i

我正在开发一个应用程序,它可以显示一系列墙纸图像,并允许用户选择一个作为应用程序的背景

应用程序读入一个目录并显示该目录中的所有.JPG图像。因此,它需要能够允许用户单击不确定长度的选项列表中的任何选项

问题是:单击列表中的任何墙纸只会传入选项以更改为列表中最后一张墙纸(即循环变量迭代,我希望调用该方法以在我分配标记的迭代中捕获循环变量的值)

以下是代码的相关部分:

for i in range(0,(howManyWalls-1)):
    #Update position
    if i % 3 == 0:
        startX=x0+10
        startY=startY+160
    else:
        startX=startX+160

self.options.append(Image.open("../includes/wallpaper/wall"+str(i+1)+".jpg"))
self.options[i].thumbnail((150,150),Image.ANTIALIAS)
self.optionThumbs.append(ImageTk.PhotoImage(self.options[i]))
self.optionThumbsDisp.append(canvas.create_image(startX,startY,anchor=NW, image=self.optionThumbs[i]))
canvas.tag_bind(self.optionThumbsDisp[i],"<Button-1>", lambda x: self.changeWallpaper(canvas,w,h,(i+1)))
范围(0,(howManyWalls-1))内的i的
:
#更新位置
如果i%3==0:
startX=x0+10
startY=startY+160
其他:
startX=startX+160
self.options.append(Image.open(“../includes/wallper/wall”+str(i+1)+.jpg”))
self.options[i].缩略图((150150),Image.antialas)
self.optionThumbs.append(ImageTk.PhotoImage(self.options[i]))
self.optionThumbsDisp.append(canvas.create_image(startX,startY,anchor=NW,image=self.optionThumbs[i]))
canvas.tag_bind(self.optionThumbsDisp[i],“”,lambda x:self.changeWallpaper(canvas,w,h,(i+1)))

这实际上是使用lambdas时经常问的问题。误解是lambda函数内部的变量
i
在某种程度上不同于外部的变量
i
。换句话说,你在做这样的事情:

i=3
def foo():
    print i
i=4
foo()  #prints 4, when you expected 3
就常规函数而言,“冻结”i值的一种方法是使用关键字参数,因为这些参数是在创建函数时计算的:

i=3
def foo(i=i):
    print i
i=4
foo()  #prints 3, you're happy now.
同样的情况也适用于lambda函数:

canvas.tag_bind(self.optionThumbsDisp[i],"<Button-1>", lambda x,i=i: self.changeWallpaper(canvas,w,h,(i+1))
canvas.tag\u bind(self.optionThumbsDisp[i],“”,lambda x,i=i:self.changeWallpaper(canvas,w,h,(i+1))
现在,(希望)它能起作用。

@GregoryGay——也许我会把它命名为“小心闭包,一个警示故事”:^)