簡體   English   中英

Python Tkinter:在for循環中將帶有標簽的函數綁定

[英]Python Tkinter: Bind function with labels in for loop

我正在使用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個標簽。 問題在於,單擊十個標簽中的任何一個, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM