pythontkinter:for循环中带标签的绑定函数

2024-04-25 15:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用tkinterfor 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个标签。问题是,单击10个标签中的任何一个,goto_video_link函数似乎只使用第10个链接。在

如果我点击第5个标签,我希望它使用第5个链接。在

我该怎么做?在


Tags: 函数代码inselfloopfor参数链接
1条回答
网友
1楼 · 发布于 2024-04-25 15:24:37

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,而不是{},而且由于{}是一个局部变量,所以在调用函数时总是重新生成它。在

相关问题 更多 >