在for循环中创建具有单独命令的标签



我试图在for循环中创建包含图像的标签列,我希望它们有一个特定的命令,当我右键单击图像左键时,我搜索了一个解决方案,发现了这个问题。BrenBarn的答案只有在我使用按钮时才有效。但是事件Button-1没有返回任何可以区分标签的值

工作:

active="red"
default_color="white"
def main(height=5,width=5):
for x in range(width):
for y in range(height):
btn = tkinter.Button(frame, bg=default_color)
btn.grid(column=x, row=y, sticky=N+S+E+W)
btn["command"] = lambda btn=btn: click(btn)
for x in range(width):
Grid.columnconfigure(frame, x, weight=1)
for y in range(height):
Grid.rowconfigure(frame, y, weight=1)
return frame
def click(button):
print(button)
if(button["bg"] == active):
button["bg"] = default_color
else:
button["bg"] = active
w= main(10,10)

不工作:

active="red"
default_color="white"
def main(height=5,width=5):
for x in range(width):
for y in range(height):
btn = tkinter.Button(frame, bg=default_color)
btn.grid(column=x, row=y, sticky=N+S+E+W)
btn.bind("<Button-1>", lambda btn=btn: click(btn))
for x in range(width):
Grid.columnconfigure(frame, x, weight=1)
for y in range(height):
Grid.rowconfigure(frame, y, weight=1)
return frame
def click(button):
print(button)
if(button["bg"] == active):
button["bg"] = default_color
else:
button["bg"] = active
w= main(10,10)

按钮的command选项和事件绑定所需的函数签名不同。command选项的函数不需要参数,而事件绑定的函数需要一个参数,即Event对象。

因此下面一行:

btn.bind("<Button-1>", lambda btn=btn: click(btn))

应该如下所示:

# added the required argument "e"
btn.bind("<Button-1>", lambda e, btn=btn: click(btn))

但是,对于您的情况,btn参数是不必要的,因为Event对象有一个属性widget,这是触发事件的小部件:

# used e.widget
btn.bind("<Button-1>", lambda e: click(e.widget))

相关内容

最新更新