在tkinter中更改使用for循环创建的按钮的颜色

2024-10-16 17:16:52 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我使用for循环创建了5 x 5按钮:

for i in range(5):
for j in range(5):
    gameButton = Button(boardFrame, bg="khaki1", width=10, height=5, command=colorTheButton)
    gameButton.grid(row=i, column=j, sticky=E)

我有一个名为changeColor()的函数:

^{pr2}$

现在的问题是,每次我点击任何一个按钮,它不会改变按钮的颜色,而是会改变最后创建的按钮的颜色。我应该怎么做来改变点击的按钮而不是最后一个?在


Tags: infor颜色rangebuttonwidth按钮command
2条回答

for循环中,为每个新按钮指定相同的名称gameButton。这意味着只有最近的按钮保存到变量中,在本例中是右下角的按钮。在

当您说row = gameButton.grid_info()['row']column = gameButton.grid_info()['column']时,这将只获得网格中最后一个按钮的位置。这意味着只有最后一个按钮会按照您的观察进行更新。在

要解决这个问题,您可以实现一个包含按钮的列表,或者实现另一种方法。其中一种方法是:

for i in range(5):
    for j in range(5):
        gameButton = Button(boardFrame, bg="khaki1", width=10, height=5,
                            command=lambda i=i, j=j: colorTheButton(i, j))
        gameButton.grid(row=i, column=j, sticky=E)

我将命令改为lambda i=i, j=j: colorTheButton(i, j),它将按钮的实际网格位置传递给colorTheButton。在

然后colorTheButton如下:

^{pr2}$

请注意,我已经尽力使您的代码尽可能地相似;这段代码仍然会每次生成一个new按钮,并将旧的按钮覆盖到位。这不如修改原来的按钮有效,但这是一个不同的问题!在

首先,您要创建多个按钮,但是它们被重写地分配给同一个变量gameButton,因此您可以引用稍后创建的最后一个按钮,这将是有问题的。在

您可以创建如下按钮:

gameButton = list()
for i in range(5)
    gameButton.append(list())
    for j in range(5)
        gameButton[i].append(Button(boardFrame, bg="khaki1", width=10, height=5, command=colorTheButton))
        gameButton[i][j].grid(row=i, column=j, sticky=E)

其次,您应该将节点信息传递给colorTheButton方法,而不是稍后再尝试找出哪个按钮被按下:

^{pr2}$

相应地修改colorTheButton

def colorTheButton(row, column):
    global colorCounter, boardColor
    if colorCounter % 2 == 0:
...

注意:该函数的最后2行也会继续创建不可引用的button对象widgets。在

所以更好:

def colorTheButton(row, column):
    global colorCounter, boardColor
    if colorCounter % 2 == 0:
        boardColor = "black"
    else:
        boardColor = "white"
    colorCounter += 1

    gameButton[row][column]['bg'] = boardColor

相关问题 更多 >