Python Tkinter:在 for 循环中使用标签绑定函数
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
函数似乎只使用第 10 个 link.
如果我点击第 5 个标签,我希望它使用第 5 个 link。
我该怎么做?
Lambda 表达式是惰性求值的,这意味着 self.go_to_link(link)
仅在执行时求值。此时 link
包含最后一个 link 的值,因此每个按钮都会转到最后一个 link。
您需要在 for 循环期间强制计算 link
。这可以通过一个 lambda 函数来完成,该函数 returns 另一个具有您想要的值的 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
是局部变量,因此它总是在函数执行时重新创建叫。
我正在使用 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
函数似乎只使用第 10 个 link.
如果我点击第 5 个标签,我希望它使用第 5 个 link。
我该怎么做?
Lambda 表达式是惰性求值的,这意味着 self.go_to_link(link)
仅在执行时求值。此时 link
包含最后一个 link 的值,因此每个按钮都会转到最后一个 link。
您需要在 for 循环期间强制计算 link
。这可以通过一个 lambda 函数来完成,该函数 returns 另一个具有您想要的值的 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
是局部变量,因此它总是在函数执行时重新创建叫。