2016-04-21 71 views
0

我想创建一个for循环,以便在其每次迭代中创建一个新变量。然后我希望能够在for循环中的新变量上运行命令,以便我可以从新变量中形成tkinter Button。在for循环的每次迭代过程中创建多个变量并在其上执行tk命令

实施例,

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”中,因此每次修改它们的命令都会被修改。至少我认为这是因为我点击的任何按钮都会将背景更改为最后创建的图像。我现在已经取消了这些代码。如果你想为参考这里是,

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 

此刻,我的新代码已经变得太复杂,我张贴只是它的一部分作为一个例子,而不是有我的源代码大块暴露于互联网。所以如果有人不明白我的问题,请让我进一步解释。此外,如果除了我指定的方式外,还有其他方法可以做到这一点,我会很乐意接受这一建议。

谢谢:)

回答

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 
0

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

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

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

以后,如果要更新的按钮,你可以参考它想:

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

基于关闭拉斐尔的建议我做到了。但是,它们的图像仍默认为最后创建的按钮的图像。如果我将按钮配置为使用带参数的lambda命令(比如说变量Index),并且该变量在for循环的整个过程中都会发生变化,那么在for循环的每次迭代过程中,Index的值都会在每个按钮中更改。我问这是因为当函数被调用时,我要求它打印Index的值。当我点击每一个按钮时,他们都将索引值打印为17(这实际上是索引的最后一个值) – LeroyJD

+1

@LeroyJD:关于在该站点的循环中创建按钮和图像有很多问题和解答。例如,http://stackoverflow.com/questions/28494089/how-to-understand-closure-in-python-lambda –

+0

这正是我需要的 – LeroyJD