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)