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

标签 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)))

最佳答案

这实际上是使用 lambda 时经常被问到的问题。误解是 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))

现在,(希望)它能起作用。

关于Python TkInter - 为不确定数量的图像分配标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11565734/

相关文章:

python - 如何在 tkinter 中使无声异常变得更响亮?

Python - 在类中初始化 tkinter,当在另一个类中需要另一个 gui 时会发生什么?

python - 如何将 Google Cloud Storage base64 md5sum 转换为十六进制版本?

python - 按组在 pandas 数据帧上滚动时间窗口

python - Django,重复一个相关查询时多次命中数据库

python - 如何在 pandas 数据帧行中检测到第一个非 nan 值后找到前 5 个值(包括 nan)?

python - 有没有办法在 Tkinter 中合并碰撞?

python - 为什么文件夹中的所有图像没有显示在 Canvas 框架内的 tkinter 标签上?

python - Tkinter——如何水平居中 Canvas 文本?

python - 阅读,修改 xml 使用 python 将其保存在新的 xml 中