2013-02-20 132 views
2

第一篇文章在這裏。Lambda意外地評估

我想製作一個電影列表。電影將顯示在Tkinter的列表中。該計劃是當您點擊更新按鈕時,程序將更新旁邊的標籤。問題在於無論您點擊哪個按鈕,都會更新最後一個標籤。我想這是因爲

lambda: self.update_rating(x)

在運行時計算,所以爲x。我希望x是它在特定循環上的內容,而不是按鈕被點擊時的範圍之外的內容。

我是新來的蟒蛇所以任何幫助表示讚賞

代碼:

from Tkinter import * 
class Application(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.grid() 
     self.create_widgets() 
    def create_widgets(self): 
     self.movies = list() 
     for x in range(0, 10): 
      movie = list() 
      rating = Label(self, text = "Rating: NA") 
      rating.grid(row = x, column = 0, columnspan = 1, sticky = W) 
      movie.append(rating) 
      update = Button(self, text = "update", command = lambda: self.update_rating(x)) 
      update.grid(row = x, column = 1, columnspan = 1, sticky = W) 
      movie.append(update) 
      self.movies.append(movie) 
    def update_rating(self, num): 
     self.movies[num][0]["text"] = "rating updated" 
root = Tk() 
root.title("Movie Sorter") 
root.geometry("640x480") 
app = Application(root) 
root.mainloop() 

回答

2

用這個代替:

lambda x=x: self.update_rating(x) 

示範:

>>> x = 1 
>>> a = lambda x=x:x 
>>> a() 
1 
>>> x = 2 
>>> a() 
1 

這裏的想法是默認的當功能是定義爲而不是創建一個閉包,當功能是,稱爲時,創建一個閉包,該閉包評估從封閉範圍中拾取變量。

+0

謝謝,我被困在這太久了。 – Henry 2013-02-20 12:54:34

+2

@亨利 - 這是一個常見問題。 – mgilson 2013-02-20 12:55:26