从Python tkinter Labels的列表(数组)中更改特定Label的属性并不像预期的那样成功



此代码适用于Python tkinter中的Bingo游戏。该界面有一个由3个名称标签组成的列表(一个标签阵列,lblName(和另一个由5列组成的列表,每个玩家都有一个标签数组,lblNums(,其中包含玩家选择的数字。

每次创建lblNums-Label数组时,其bg颜色都设置为黄色,而不使用任何下标。

";玩家";列表包含玩家的名字和他们选择的号码。

在click((中,每次单击都会随机生成一个数字。如果它与一个或多个玩家选择的数字匹配,则任何与该数字bg颜色匹配的lblNums都应变为绿色(第31行(。然而,每当玩家的数字与随机数匹配时,总是lblNums的最后一行最后一列会改变颜色。我需要使用下标来更改正确单元格的颜色吗?我的代码是:

from tkinter import Tk, Label, Button
from random import randint
win = Tk()
win.geometry("350x300+0+0")
win.title("B I N G O")
players = [["Jason",  [0, 1, 2, 3, 4]],
["Sheena", [3, 4, 5, 6, 7]],
["Arthur", [5, 6, 7, 8, 9]]
]
for i in range(3):
lblName = Label(win, text=players[i][0], width=10, font=("Consolas", 16, "bold"), anchor="e").place(x=10, y=i*30)
for j in range(3):
for k in range(5):
lblNums = Label(win, text=str(players[j][1][k]), font=("Helvetica", 16, "bold"), bg="yellow", width=2, anchor="e")
lblNums.place(x=150+k*35, y=j*30)
def click():
num = randint(0, 9)
for i in range(3):
for j in range(5):
print(num, players[i][1][j])
if players[i][1][j] == num:
print("Match")
lblNums.config(bg="green")
print()
print("===========")
btn = Button(win, text="Click", command=click)
btn.place(x=100, y=220)
win.mainloop()

下面的样本输出显示数字6是随机抽取的,并且为玩家2&3.因此,lblNums的第2行第4列和第3行第2列应该变为绿色。但是,只有第3行第5列会更改颜色。

6 0

6 1

6 2

6 3

6 4

6 3

6 4

6 5

6 6

匹配

6 7

6 5

6 6

匹配

6 7

6 8

6 9

目前,您正在更改labelNums的颜色。这指的是您制作的最后一个标签,因此它总是在右下角高亮显示。这是我的解决方案:

labelList = []
for j in range(3):
row = []
for k in range(5):
lblNums = Label(win, text=str(players[j][1][k]), font=("Helvetica", 16, "bold"), bg="yellow", width=2, anchor="e")
lblNums.place(x=150+k*35, y=j*30)
row.append(lblNums)
labelList.append(row)
def click():
num = randint(0, 9)
for i in range(3):
for j in range(5):
print(num, players[i][1][j])
if players[i][1][j] == num:
print("Match")
labelList[i][j].config(bg="green")
print()
print("===========")

需要有一个对所有标签的引用,以便以后可以修改它们。为此,我添加了一个名为labelsList的列表。然后,当您制作标签时,每行都有一个列表,该行中的每个项目都会附加到row列表,然后再附加到labelsList。然后在click()中,当您找到匹配项时,可以使用labelsList使用行/列找到所需的标签,然后更改其颜色。

最新更新