[英]Python Tkinter, lambdas and callbacks
Windows 7x64 Python2.7
我希望將Python線程解決方案中的Lexical閉包應用到我的代碼中。 附加讀數for循環和詞匯環境中的閉包
我瀏覽一個圖像列表,縮略圖對,並顯示縮略圖,點擊標簽后,它應顯示一個新的TopLevel,其中包含完整大小的圖像。
實際發生的是它只顯示了ImagePairs的最后一個圖像。 搜索一下,我發現上面發布的帖子,但我不確定如何將它應用到我的情況中。
row, col = 0, 0
#create a frame for the row
rowFrame = Frame(master)
for image, thumb in ImagePairs:
curLbl = Label(rowFrame, image=thumb)
curLbl.grid(row=0, column=col, sticky='news')
curLbl.bind('<Button-1>', lambda e:self.popImage(image)) #or curLbl.image
col += 1
if col >= 3:
rowFrame.grid(row=row)
#create a new frame, for the next row
rowFrame = Frame(master)
col = 0
row += 1
我想做一個像這樣的功能
def func(img=img):
return img
並將其插入grid()和bind()之間的空格中,但是我得到了丟失圖像的錯誤。 如何修改我的代碼以適應它?
您可以將默認值image = image
添加到lambda本身:
for image, thumb in ImagePairs:
curLbl = Label(rowFrame, image=thumb)
curLbl.grid(row=0, column=col, sticky='news')
curLbl.bind('<Button-1>', lambda e, image = image:self.popImage(image)) #or curLbl.image
如果您使用默認值image
而不是img
那么定義func
想法也會有效:
def func(e, img = image):
self.popImage(img)
要記住的關鍵是默認值是在定義 lambda(或函數)時綁定的。
因此,每次循環時,都會使用自己的局部變量image
定義一個新的lambda,並在定義時將image
綁定自己的默認值。 因此,當稍后調用lambda時,訪問右image
。
與沒有提供默認值的情況相比: image
不再是lambda的局部變量。 當調用lambda時,Python會在封閉范圍內尋找它。 但到那時,完成for循環並將封閉范圍中的image
設置為ImagePairs
的最后一個值。 這就是為什么無論你按下什么按鈕你都得到相同的最后一張圖像:所有lambdas都訪問了同一個變量image
的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.