循环中的Tkinter Button命令执行总是最后一个命令

时间:2014-12-02 11:11:18

标签: 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], 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之外,它运行正常。怎么解决?

谢谢。

1 个答案:

答案 0 :(得分:0)

这是因为后期绑定,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)

BTW,使用command的回调集不会使用参数调用。