Python TkInter - 分配标签以确定不确定的图像数量

时间:2012-07-19 16:58:00

标签: python tkinter

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

应用程序读入目录并在目录中显示所有.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)))

1 个答案:

答案 0 :(得分: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))

现在,(希望)它有效。