Глава 17 · Проект: «Крестики-нолики»
При нажатии на кнопку рисуем на ней
Каждая кнопка должна знать свой номер — здесь прячется одна из самых известных тонкостей Python.
Каждой кнопке нужна своя функция-обработчик клика, которая знает какая именно
кнопка нажата. Хитрость в том, чтобы связать command с номером
кнопки — для этого используем лямбда-функцию из главы 13:
risuem_na_knopke.py
def na_knopku_nazhali(indeks):
global tekuschij_igrok
if polya[indeks]["text"] != "":
return # клетка уже занята
polya[indeks]["text"] = tekuschij_igrok
tekuschij_igrok = "O" if tekuschij_igrok == "X" else "X"
# при создании каждой кнопки:
knopka.config(command=lambda i=indeks: na_knopku_nazhali(i))
Зачем lambda i=indeks, а не просто lambda: na_knopku_nazhali(indeks)?
Без
i=indeks все девять кнопок запомнили бы одну и ту же переменную indeks — а не её значение в момент создания. К моменту клика цикл давно завершится, и indeks будет равен 8 для всех кнопок сразу. Значение по умолчанию i=indeks «замораживает» текущее значение при создании каждой лямбды — классическая и важная тонкость Python.Практика в Jupyter Notebook
17-04-risuem.ipynb · обработка клика по клетке поля