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) 
  • всплывающее окно tkinter и обработка текста для автозаполнения
  • Windows думает, что tkinter не отвечает
  • Поиск определенного блока кода в тексте
  • Python tkinter с календарем ttk
  • Каждый экземпляр класса Tk () работает независимо друг от друга?
  • Python, Tkinter - Вставка текста в окна холста
  • Пакет сообщений импорта Python tkinter 8.5
  • Как я могу запрограммировать два одновременных события нажатия клавиш в tkinter, чтобы перемещать элемент холста по диагонали с помощью словаря событий нажатия клавиш?
  • Python / Tkinter: безопасен ли поток Tkinter StringVar (IntVar и т. Д.)?
  • Tkinter to android translation
  • Как обновить Tcl / Tk в Python?
  • Python - лучший язык программирования в мире.