检查按钮和按钮:使用 lambda
Checkbuttons and buttons: using lambda
我正在尝试根据列表创建多个复选框,但看起来我搞砸了命令调用和变量方面 按钮。
我的代码是:
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)
如果您想做更多研究,这被称为词法 scoping 或闭包。
我正在尝试根据列表创建多个复选框,但看起来我搞砸了命令调用和变量方面 按钮。
我的代码是:
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)
如果您想做更多研究,这被称为词法 scoping 或闭包。