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
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