Botones de verificación y botones: utilizando lambda

Estoy tratando de hacer un número de casillas de verificación basadas en una lista, sin embargo, parece que estoy jodiendo la llamada de comando y el aspecto variable del botón.

Mi código es:

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] 

Hasta ahora, la prueba es para que el curso se imprima en la consola cuando la checkbox está activada, sin embargo, solo funciona para el segundo botón, el botón “CSE 4343”. Cuando interactúo con el botón “CSE 4444”, no se imprime nada.

Además, el valor de “lugar” está onClick siempre es 1, ya sea que esté haciendo clic en el botón “CSE 4343” o en el botón “CSE 4444”.

Related of "Botones de verificación y botones: utilizando lambda"

Cuando haces una función lambda , sus referencias solo se resuelven en valores cuando se llama a la función. Por lo tanto, si crea funciones lambda en un bucle con un valor de mutación ( i en su código), cada función obtiene la misma i , la última disponible.

Sin embargo, cuando define una función con un parámetro predeterminado, esa referencia se resuelve tan pronto como se define la función. Al agregar dicho parámetro a sus funciones lambda , puede asegurarse de que obtengan el valor que pretendía.

 lambda i=i: self.onClick(i) 

Esto se conoce como scope o cierre léxico, si desea hacer más investigación.