[英]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.