Python Tkinter按钮循环中的命令始终执行最后一个命令

Python Tkinter按钮循环中的命令始终执行最后一个命令,python,button,tkinter,Python,Button,Tkinter,我没有经验的程序员,我无法找到解决这个问题的办法。 我想创建一个带有按钮描述的子例程的长列表,并使用下面的代码创建按钮。但这样的代码总是将列表中最后一个子例程分配给所有按钮 self.row=Frame(root) self.programs=(('description1',p1),('description2',p2)) for self.program in self.programs: self.b= Button(self.row, text=self.program[0],

我没有经验的程序员,我无法找到解决这个问题的办法。 我想创建一个带有按钮描述的子例程的长列表,并使用下面的代码创建按钮。但这样的代码总是将列表中最后一个子例程分配给所有按钮

self.row=Frame(root)
self.programs=(('description1',p1),('description2',p2))
for self.program in self.programs:
    self.b= Button(self.row, text=self.program[0], command=lambda event="":self.program[1]())
    self.row.pack(side=TOP, fill=X, padx=5, pady=5)
    self.b.pack(side=LEFT, padx=5, pady=5)
它运行正常,但所有按钮都在执行p2。如何解决这个问题


谢谢。

这是因为后期绑定,
self.program
决定何时调用回调,而不是何时创建回调

使用默认参数可避免此问题:

self.row=Frame(root)
self.programs=(('description1',p1),('description2',p2))
for naem, callback in self.programs:
    self.b = Button(self.row, text=self.program[0],
                    command=lambda callback=callback: callback())  # <---
    self.row.pack(side=TOP, fill=X, padx=5, pady=5)
    self.b.pack(side=LEFT, padx=5, pady=5)
self.row=帧(根)
self.programs=('description1',p1),('description2',p2))
对于naem,在self.programs中回调:
self.b=按钮(self.row,text=self.program[0],
command=lambda callback=callback:callback())#