Rozdział 17 · Projekt: „Kółko-krzyżyk”

Podczas naciśnięcia przycisku rysujemy na nim

Każdy przycisk powinien znać swój numer – jedna z najsłynniejszych subtelności Python. jest tu ukryta

Każdy przycisk potrzebuje własnej funkcji obsługi klików, która wie o tym jaka dokładnie przycisk jest naciskany. Sztuczka polega na podłączeniu command z numerem przycisku — do tego używamy funkcji lambda z rozdziału 13:

risuem_na_knopke.py
def na_knopku_nazhali(indeks):
    global tekuschij_igrok

    if polya[indeks]["text"] != "":
        return   # komórka już zajęta

    polya[indeks]["text"] = tekuschij_igrok
    tekuschij_igrok = "O" if tekuschij_igrok == "X" else "X"

# przy tworzeniu każdego przycisku:
knopka.config(command=lambda i=indeks: na_knopku_nazhali(i))
Dlaczego lambda i=indeks a nie tylko lambda: na_knopku_nazhali(indeks)?
Bez i=indeks wszystkie dziewięć przycisków pamiętało tę samą zmienną indeks — nie jego wartości w momencie tworzenia. W momencie kliknięcia cykl już dawno się zakończy, i indeks będzie 8 dla wszystkich przycisków jednocześnie. Domyślnie i=indeks „zamraża” aktualną wartość przy tworzeniu każdej lambdy — klasyczny i ważny niuans Python.
na przycisku pola 0 pojawił się X, status zmieniał się na Ruch Gracza: O
Rzeczywiste okno pełnego pliku prototypu: kliknięcie na pierwszą komórkę — na niej narysowano X, kolej przeszła do O.
Praktyka: Przetwarzanie kliknięcia na komórce pola
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →