Некорректно работает кнопка в tkinter python 3.10
Хочу отрисовать сетку 16x16 для игры в крестики-нолики.
import tkinter as tk
window = tk.Tk()
window.title("Крестики-нолики")
window.geometry("800x650")
iszero = False
def clc():
global iszero
if iszero == False:
btn["text"] = "x"
iszero = True
else:
btn["text"] = "o"
iszero = False
for i in range(1, 17):
for j in range(1, 17):
btn = tk.Button(window, width=5, height=2, command=clc)
btn.grid(column=i, row=j)
window.mainloop()
Почему-то при запуске этого кода текст меняется не на нажатой кнопке, а на одной и той же, которая находится в углу.
Ответы (1 шт):
Автор решения: Арамис
→ Ссылка
Дело в том, что Вы создаете одну кнопку и в цикле постоянно меняете её значение. В результате переменная btn хранит значение последней созданной кнопки (которая и находится в правом нижнем углу).
Итак:
- Для удобства лучше хранить размер поля в переменной (например size = 16)
- Далее, Вам нужно создать матрицу 16x16 из кнопок (btns = [[0 for x in range(size)] for y in range(size)])
- И для каждой кнопки из матрицы указать какой аргумент передавать в функцию-обработчик (clc); обычно это делают через lambda-функции
В итоге, такой код:
import tkinter as tk
window = tk.Tk()
window.title("Крестики-нолики")
window.geometry("800x650")
iszero = False
def clc(index):
global iszero
i, j = index
if iszero == False:
btns[i][j]["text"] = "x"
iszero = True
else:
btns[i][j]["text"] = "o"
iszero = False
size = 16
btns = [[0 for x in range(size)] for y in range(size)]
for i in range(size):
for j in range(size):
btn_clc = lambda x = (i, j): clc(x)
btns[i][j]= tk.Button(window, width=5, height=2, command=btn_clc)
btns[i][j].grid(column=i, row=j)
window.mainloop()