Глава 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 · обработка клика по клетке поля
Открыть ноутбук →