Python 检查按钮和按钮:使用lambda
我试图在列表的基础上做一些复选框,但是看起来好像我搞糟了命令调用和按钮的可变方面 我的代码是:Python 检查按钮和按钮:使用lambda,python,user-interface,tkinter,Python,User Interface,Tkinter,我试图在列表的基础上做一些复选框,但是看起来好像我搞糟了命令调用和按钮的可变方面 我的代码是: class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.courses = ["CSE 4444", "CSE 4343"] self.v
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.courses = ["CSE 4444", "CSE 4343"]
self.vars = []
self.parent.title("Homework Helper")
self.course_buttons()
self.pack(fill=BOTH, expand=1)
def course_buttons(self):
x = 0
y = 0
for i in range(0, len(self.courses)):
self.vars.append(IntVar())
cb = Checkbutton(self, text=self.courses[i],
variable=self.vars[i],
command=lambda: self.onClick(i))
cb.select()
cb.grid(column=x, row=y)
y = y+1
def onClick(self, place):
print place
if self.vars[place].get() == 1:
print self.courses[place]
到目前为止的测试是当复选框打开时在控制台上打印课程,但是它仅适用于第二个按钮,即按钮“CSE 4343”。当我与按钮“CSE 4444”交互时,不会打印任何内容
此外,“place”值为onClick始终为1,无论我是单击按钮“CSE 4343”还是按钮“CSE 4444”。创建
lambda
函数时,其引用仅在调用函数时解析为值。因此,如果您在循环中使用一个变异值(i
)创建lambda
函数,则每个函数都会得到相同的i
——最后一个可用的函数
但是,当使用默认参数定义函数时,该引用将在定义函数后立即解析。通过将此类参数添加到lambda
函数中,可以确保它们获得您想要的值
lambda i=i: self.onClick(i)
如果你想做更多的研究,这被称为词法或闭包。到底什么不起作用?与观察到的行为相比,预期的行为是什么?有任何错误消息吗?@TigerhawkT3我在编辑中对这些消息进行了处理抱歉。由于,请尝试
lambda I=I:self.onClick(I)
。