簡體   English   中英

Python Tkinter,lambdas和回調

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

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