更改 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)
代码:
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
你的代码有两个问题:
问题 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)