在for循环的每次迭代期间创建多个变量并在它们上执行tk命令

时间:2016-04-21 10:56:53

标签: python python-2.7 tkinter

我想创建一个for循环,以便在每次迭代期间创建一个新变量。然后我希望能够在for循环中的新变量上运行命令,这样我就可以在新变量中形成tkinter Buttons。

实施例,

for i in range(0,17):
    #Should create variables Button1, Button2, Button3 and so on.
    Button+str(i)=tk.Button(root, image=img, command=lambda: changebg(i))
    Button+str(i).grid(column=0, row=0)

我想要这样做的原因是我想将16个图像放入tkinter帧并希望每个按钮映射到不同的图像,这样当单击按钮时,根窗口背景被设置为图像的点击按钮。之前,我创建了一个创建16个按钮的for循环,但每个按钮都存储在变量“Button”中,因此每次都修改了对它们的命令。 Atleast我认为这是因为我点击的任何按钮都将背景更改为最后创建的图像。我现在已经废弃了这段代码。如果你想在这里参考它,

for imgphoto in (imagedict.keys()):
    imgbtnphoto=Image.open(imgphoto)
    imgbtnphoto.thumbnail((120,120))
    buttonphoto= ImageTk.PhotoImage(imgbtnphoto)
    GridColumn=imagedict[imgphoto]%4
    GridRow=imagedict[imgphoto]/4
    Button= tk.Button(root, image=buttonphoto, command=lambda: changebg(str(GridColumn)+str(GridRow)))
    Button.grid(column=GridColumn, row=GridRow)
    Button.image=buttonphoto

目前,我的新代码变得过于复杂,我只能将其中的一部分作为示例发布,并且没有大量的源代码暴露给互联网。所以,如果有人不理解我的疑问,请让我进一步解释。此外,如果除了我指定的方式之外还有其他方法可以做到这一点,我很乐意接受这个建议。

谢谢:)

2 个答案:

答案 0 :(得分:1)

为什么不使用列表来存储按钮上的引用,如:

buttons = []
buttonphotos = []
# here goes your loop
for imgphoto in (imagedict.keys()):
    buttonphotos.append(Image.open(imgphoto).thumbnail((120,120)))
    # [...] some of your actions
    # access buttonphoto by using last elem index
    # buttonphotos[-1]
    buttons.append(tk.Button(root, [...])) # pseudo code line
    buttons[-1].grid([...]) # pseudo code line

答案 1 :(得分:0)

不要创建动态变量名称。它使您的代码几乎无法读取。

一个简单的解决方案是使用字典,名称为键:

buttons = {}
for i in range(0,17):
    name = "Button" + str(i)
    buttons[name] = tk.Button(...)
    ...

稍后,如果您想更新按钮,可以像以下一样引用它:

buttons["Button1"].configure(...)