如何使用 tkinter 中的二维列表访问按钮网格中的按钮?

How to access a button in a grid of buttons using a 2D list in tkinter?

我是 tkinter 的初学者,我试图使用 2D 列表创建一个 5X5 的按钮网格。 但是如果我尝试在 for 循环之后更改按钮的 bg 颜色,它只会更改最后一行按钮的颜色。

from tkinter import *
rows=5
columns=5
btns=[[None]*5]*5
root=Tk()
def darken(btn):
    btn.configure(bg='black')
for i in range(rows):
    for j in range(columns):
        btns[i][j]=Button(root,padx=10,bg='white')
        btns[i][j]['command']=lambda btn=btns[i][j]:darken(btn)
        btns[i][j].grid(row=i,column=j)
btns[0][0]['bg']='yellow'
root.mainloop()

问题在于您构建列表的方式

btns=[[None]*5]*5

通过这种方式,您可以创建一个列表并每 5 次对其引用进行 moltiplicate。 因为每次它循环在行列表中添加一个按钮时,相同的更改会影响其他行列表。

EX

btns = [[None]*5]*5
btns[0][0] = 'a'

btns ---> [
['a', None, None, None, None],
['a', None, None, None, None],
['a', None, None, None, None],
['a', None, None, None, None],
['a', None, None, None, None]
]

这是构建列表的正确方法

btns = [[None for i in range(rows)] for j in range(columns)]