更改 Tkinter 按钮命令方法时出错

error when changing a Tkinter button command method

代码:

from tkinter import * 

#screen 1
scr1 = Tk()
scr1.configure(bg='#2e3033')
canvas = []
teamCommentsButton = []

#update Vissuals
def updateTeams():
    for x in range(6):
        onClick = lambda : comments(x+10)
        canvas[x].itemconfig(teamCommentsButton[x], command = onClick)

def comments (team):
    print(team)
    comments = Toplevel(scr1)

for x in range(6):
    canvas.append(Canvas(scr1, width = 840, height = 326, bg='#2e3033', highlightthickness=1, highlightbackground='#2e3033'))
    teamCommentsButton.append(Button(canvas[x], text='☰', command = lambda : comments(x), width = 2, height = 1))
    teamCommentsButton[x].place(x = 20, y = 20)
    canvas[x].grid(column = 0 if x < 3 else 1, row = (x if x < 3 else x - 3))

scr1.title('Pit TV - Match')
updateTeams()
scr1.mainloop()

错误:

Traceback (most recent call last):
  File "c:\Users\user\Documents\Team 1710\Code\GKC2022\test.py", line 26, in <module>
    updateTeams()
  File "c:\Users\user\Documents\Team 1710\Code\GKC2022\test.py", line 13, in updateTeams
    canvas[x].itemconfig(teamCommentsButton[x], command = onClick)
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 2903, in itemconfigure
    return self._configure(('itemconfigure', tagOrId), cnf, kw)
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1636, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: invalid boolean operator in tag search expression

我希望能够在 Tkinter 按钮中更改命令的参数,但是当我尝试这样做时出现此错误。我尝试将参数更改为常量 onClick = lambda : comments(10) 并且尝试直接将方法调用作为命令 command = comments(x+10) 但两者都给我相同的错误

最重要的是,当我删除对 updateTeams() 的调用时,代码运行没有错误,但无论我单击哪个按钮都会打印 5。我希望它根据我单击的按钮打印 0-5 的范围,因为我为每个按钮设置的参数取决于 x。

这是我删除 updateTeams() window

后 window 的样子

你的代码有两个问题:

问题 1

这些按钮不是 canvases 的项目。

你必须像对待普通的 tkinter 小部件一样对待按钮并使用配置:

teamCommentsButton[x].configure(command=onClick)

如果您希望按钮实际位于 canvas 内,您必须将其添加到另一个框架并将该框架作为项目添加到 window 使用:

canvas[x].create_window((20, 20), window=buttonFrame)

问题 2

In Python 在循环中创建的 lambda 函数将执行相同的函数。这意味着您在 updateTeams() 中的 lambda 将始终使用 x = 15。这可以通过使用自己的函数来创建 lambda 来避免:

def create_lambda(x):
    return lambda: comments(x + 10)