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