[英]Python Tkinter: Bind function with labels in for loop
我正在使用tkinter
在for loop
动态创建标签。 我不知道将创建多少个标签,但是单击每个标签时,必须使用特定的参数来调用特定的函数。
为此,我使用以下代码:
for link in list_of_links:
link_label = Label(self.video_window, text="Frame "+str(video_number), fg="blue", cursor="hand2")
link_label.pack()
link_label.place(x=xcod2, y=ycod2)
link_label.bind("<1>", lambda x: self.goto_video_link(link))
目前,我正在创建10个标签。 问题在于,单击十个标签中的任何一个, goto_video_link
函数似乎仅使用第十个链接。
如果单击第5个标签,则希望它使用第5个链接。
我该怎么办?
Lambda表达式是延迟计算的,这意味着self.go_to_link(link)
仅在执行时才计算。 此时, link
包含最后一个链接的值,因此每个按钮都将转到最后一个链接。
您需要在for循环中强制评估link
。 这可以通过lambda函数完成,该函数返回另一个具有所需值的lambda函数。 我知道这似乎令人困惑,但是下面的代码可能会使它更清晰。
eval_link = lambda x: (lambda p: self.go_to_link(x))
for link in list_of_links:
link_label = Label(self.video_window, text="Frame "+str(video_number), fg="blue", cursor="hand2")
link_label.pack()
link_label.place(x=xcod2, y=ycod2)
link_label.bind("<1>", eval_link(link))
在这种情况下,要能够构建内部lambda,必须评估link
。 由于将其作为参数传递,因此最里面的lambda绑定到本地副本x
而不是link
并且由于x
是本地变量,因此在调用函数时始终会对其进行重新制作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.