我是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次重复引用一次。因此,每次循环在行列表中添加按钮时,相同的更改都会影响其他行列表。
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)]