检查按钮和按钮:使用lambda

use*_*869 3 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.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]
Run Code Online (Sandbox Code Playgroud)

到目前为止的测试是在复选框打开时在控制台上打印课程,但它仅适用于第二个按钮"CSE 4343"按钮.当我与按钮"CSE 4444"交互时,没有打印任何内容.

此外,"place"值onClick始终为1,无论我是单击按钮"CSE 4343"还是按钮"CSE 4444".

Tig*_*kT3 6

创建lambda函数时,其引用仅在调用函数时解析为值.因此,如果您lambda在具有变异值的循环中创建函数(i在您的代码中),则每个函数都会相同i- 最后一个函数可用.

但是,使用默认参数定义函数时,只要定义了函数,就会解析该引用.通过在lambda函数中添加这样的参数,可以确保它们获得您希望的值.

lambda i=i: self.onClick(i)
Run Code Online (Sandbox Code Playgroud)

如果你想做更多的研究,这被称为词汇范围或闭包.