Lambda意外求值

2024-04-19 03:40:29 发布

您现在位置:Python中文网/ 问答频道 /正文

第一个帖子在这里。你知道吗

我想列一张电影的单子。电影将在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()

Tags: lambdatextself电影tkinterdefupdateroot
1条回答
网友
1楼 · 发布于 2024-04-19 03:40:29

改用这个:

lambda x=x: self.update_rating(x)

演示:

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

这里的思想是,当函数被定义时,默认参数被求值,而不是创建一个闭包,当函数被调用时,闭包从封闭范围中提取变量。你知道吗

相关问题 更多 >