Python Tkinter, configuración de funciones de callback de botón con un bucle

Estoy escribiendo un progtwig que muestra una cuadrícula de botones, cuando se presiona un botón, quiero que imprima la ubicación del botón en la cuadrícula (“columna de fila”) en la consola. Esto es lo que tengo

import Tkinter as tk class board(tk.Tk): def __init__(self, parent=None): tk.Tk.__init__(self,parent) self.rows = 5 self.columns = 5 self.init_board() def init_board(self): for i in range(self.rows): for j in range(self.columns): cmd = lambda: self.button_callback(i,j) b = tk.Button(self, text=str(" "), command=cmd) b.grid(row=i, column=j) def button_callback(self, row, col): print(str(row) + " " + str(col)) if __name__ == '__main__': board().mainloop() 

el problema es que cuando hago clic en cualquiera de los botones se imprime “4 4”, que es la ubicación del último botón instanciado en el bucle. No sé por qué sucede esto, por favor ayuda!

En la función creada utilizando lambda , i , j refiere a lo variable en la función init_board , que se establecen en 4, 4 después for finalice el bucle for .

Puede solucionar esto utilizando el argumento predeterminado.


Reemplace la siguiente línea:

 cmd = lambda: self.button_callback(i,j) 

con:

 cmd = lambda i=i, j=j: self.button_callback(i,j)