簡體   English   中英

2d數組中的Tkinter按鈕綁定到同一命令

[英]Tkinter Buttons in a 2d array get bound to the same command

我正在制作一個簡單的程序,該程序創建tkinter.Button()的3x3矩陣,當按下按鈕時,它應該在上面顯示“ Clicked”文本。 但是結果似乎是位於同一列上的按鈕被綁定到同一命令-以該列最后一行的按鈕為目標的命令。

from tkinter import *

root = Tk()

text = [[None]*3]*3
buttons = [[None]*3]*3

def action(i, j):
    text[i][j].set('Clicked')

for i in range(3):
    for j in range(3):
        text[i][j] = StringVar()
        text[i][j].set('(%d, %d)' % (i,j))
        buttons[i][j] = Button(root, command = lambda i=i, j=j : action(i, j))
        buttons[i][j].config(textvariable = text[i][j], width = 9, height = 5)
        buttons[i][j].grid(row = i, column = j)

root.mainloop()

圖片在這里

問題不在於您的命令,而在於創建列表的方式。

當您將一個列表相乘時,實際上是對該單個列表的引用也相乘(請參閱此問題 )。 運行以下代碼時,您可以看到此信息:

text = [[None]*3]*3
print([id(x) for x in text])

因此,當您更改其中一個列表中的項目時,該項目在所有列表中都會更改。 因此,您的列表看起來不像[[1,2,3],[4,5,6],[7,8,9]] ,而是像[[7,8,9],[7,8,9],[7,8,9]] 然后,當您認為設置StringVar數字1時,實際上是設置Stringvar數字7,因此更改了按鈕數字7。

您可以使用列表理解而不是乘法來創建三個單獨的列表。 如下面的代碼所示,這將生成三個單獨的列表。

text = [[None]*3 for _ in range(3)]
print([id(x) for x in text])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM