Вам необходимо создать правильную лямбда-функцию для этого набора циклов, чтобы кнопки отправляли правильную информацию в функцию и не заставляли команду выполняться при инициализации.
В python, когда вам нужночтобы сохранить ссылку на функцию, у вас есть 2 варианта.
Для функций, которые не принимают аргументов, вы можете оставить скобку ()
, чтобы сохранить ссылку на функцию или, если вам нужно передать аргументы, вы можетеиспользуйте лямбда-выражение.
Если вы используете лямбда-выражение и у вас есть переменные в вашем цикле, как вы делаете здесь, тогда вам нужно определить, что является каждым аргументом для цикла, иначе все эти значения будут равнысамые последние значения циклов.
Например, если вы просто используете лямбду, не определяя переменные в каждом цикле, вы получите кнопки, которые отправляют одни и те же данные.
Вот пример:
import tkinter as tk
root = tk.Tk()
def marcar(i, j, texto):
print(i, j, texto)
for i in range(0, 3):
for j in range(0, 3):
tk.Button(root, text='button {}.{}'.format(i, j), command=lambda: marcar(i, j, "x")).grid(row=i, column=j)
root.mainloop()
Результаты:

Однако если выУточняя значения в лямбда-выражении каждого цикла, вы получите правильные значения для каждой кнопки.
Пример:
import tkinter as tk
root = tk.Tk()
def marcar(i, j, texto):
print(i, j, texto)
for i in range(0, 3):
for j in range(0, 3):
tk.Button(root, text='button {}.{}'.format(i, j), command=lambda i=i, j=j: marcar(i, j, "x")).grid(row=i, column=j)
root.mainloop()
Результаты:
