我不是经验丰富的程序员,我找不到解决这个问题的方法。 我想用它们的按钮描述创建一个很长的子程序列表,并使用下面的代码来创建按钮。但是这样的代码总是将最后一个子程序从列表分配给所有按钮。
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之外,它运行正常。怎么解决?
谢谢。
答案 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
的回调集不会使用参数调用。