首先发布在这里。
我正在尝试制作电影列表。电影将在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()
答案 0 :(得分:2)
请改用:
lambda x=x: self.update_rating(x)
演示:
>>> x = 1
>>> a = lambda x=x:x
>>> a()
1
>>> x = 2
>>> a()
1
这里的想法是,当函数定义时,将计算默认参数,而不是创建一个闭包,当函数被调用时,该闭包会从封闭范围中获取变量