Rozdział 17 · Interfejs gry

Hover preview przez bind()

Pokazanie możliwego ruchu nie oznacza jego dokonania. To właśnie ten efekt dowodzi, dlaczego model jest potrzebny.

Najazd — charakterystyczny efekt wizualny rozdziału

Najazd na pustą komórkę pokazuje blade podgląd X
Prawdziwe okno pełnej wersji: przebieg X, tymczasowy podgląd nie zmienia board. Fragment poniżej odpowiada jedynie za efekt zawisu.
Po X zakręcie najecham pokazuje blady podgląd O
Rzeczywiste okno tej samej wersji zmienia się wraz z current_player w miarę postępów O:, ale pusta komórka w modelu pozostaje pusta.
hover_preview.py
def on_cell_enter(self, index):
    state = self.state
    if state.game_over or state.board[index]:
        return   # nie pokazuj podglądu – koniec gry lub komórka jest zajęta
    self.buttons[index].config(text=state.current_player, fg=HOVER_COLOR)

def on_cell_leave(self, index):
    self.render()   # nie 'text=„”
on_cell_leave NIE powinno po prostu usuwać tekstu
Naiwna implementacja on_cell_leave typu self.buttons[index].config(text="") wymaże już WYKONANY ruch, jeśli gracz najecha myszką nad zajętą komórką w inny sposób – Debug Lab 13 (Rozdział 17.29) szczegółowo to wyjaśnia. Poprawny kod zawsze rysuje z modelu, zamiast zgadywać, co wymazać.

dowód: Model się nie zmienia

hover_ne_menyaet_model.py
assert app.state.board[4] == ""
app.on_cell_enter(4)
assert app.state.board[4] == ""     #AFTER zawisłem – nadal pusty
app.on_cell_leave(4)
assert app.state.board[4] == ""     # i po opuszczeniu kursora — też
Praktyka: hover preview na prawdziwym polu
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →