Python Tkinter, настройка функций обратного вызова кнопки с помощью цикла

Я пишу программу, которая отображает сетку кнопок, когда нажимается кнопка. Я хочу, чтобы она напечатала местоположение кнопки в сетке (колонка «строка») на консоли. Вот что я имею

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() 

проблема в том, что когда я нажимаю на любую из кнопок, я получаю распечатку «4 4», которая является адресом последней кнопки, созданной в цикле. Я не знаю, почему это происходит, пожалуйста, помогите!

One Solution collect form web for “Python Tkinter, настройка функций обратного вызова кнопки с помощью цикла”

В функции, созданной с использованием lambda , i , j ссылается на переменную в функции init_board , которая устанавливается в 4, 4 после окончания цикла for .

Вы можете обходным путем использовать аргумент по умолчанию.


Замените следующую строку:

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

с:

 cmd = lambda i=i, j=j: self.button_callback(i,j) 
  • Как заменить метку в Python Tkinter?
  • ImportError: нет модуля с именем _imagingtk
  • Tkinter bind не вызывает funtion
  • Каковы аргументы для обратных вызовов метода трассировки переменной Tkinter?
  • Как я могу сопоставить цвета фона для рамки в ноутбуке для ttk / Tkinter на Mac?
  • Как сделать Мандельброт быстрее?
  • записи получают данные из выбора combobox с использованием tkinter и python
  • Tkinter получает нажатое событие от функции
  • Python - лучший язык программирования в мире.