2016-04-21 73 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