【问题标题】:Lambda evaluating unexpectedlyLambda 意外评估
【发布时间】:2013-02-20 12:52:43
【问题描述】:

第一次发帖。

我正在尝试制作电影列表。电影将显示在 Tkinter 的列表中。计划是当您单击更新按钮时,程序将更新它旁边的标签。问题是无论您单击哪个按钮,它总是会更新最后一个标签。我想这是因为

lambda: self.update_rating(x)

在运行时进行评估,x 也是如此。我希望 x 成为该特定循环中的内容,而不是单击按钮时超出范围的内容。

我是 python 新手,所以感谢任何帮助

代码:

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()

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    改用这个:

    lambda x=x: self.update_rating(x)
    

    演示:

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

    这里的想法是,默认参数在函数被定义时被评估,而不是创建一个闭包,它在函数被调用时从封闭范围中提取变量 em>。

    【讨论】:

    • 谢谢,我卡在这个问题上太久了。
    • @Henry -- 这是一个常见问题。
    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多