Rozdział 17 · Ostatnie poprawki
Visual effects i after()
Jeden krótki, nieblokujący efekt – zwycięstwo powinno być zauważalne, a nie disco.
Jeden subtelny efekt — nie framework animacji
Po wygranej komórki linii zwycięskiej są raz delikatnie podświetlone i spokojnie wracają do stałego podświetlenia. W rzeczywistym oknie wygląda to jak krótka zmiana między accent-stanem a bazowym podświetleniem zwycięstwa; strona nie może pokazać animacji wideo, dlatego poniżej są prawdziwe kadry tej zmiany, a lokalna aplikacja przełącza je przez after(). Łącznie dwa rozróżnialne klatki:
trzeci kadr pokrywa się z drugim nieprzypadkowo — efekt kończy się właśnie na stałym
podświetleniu zwycięstwa i dalej nic się nie zmienia.
Efekt jest celowo powściągliwy — brak ostrych, kontrastowych migotów.
pulse_winning_line.py
def pulse_winning_line(self, tick=0):
if not self.state.winning_line:
return
color = PULSE_BG if tick == 0 else WIN_BG
for index in self.state.winning_line:
self.buttons[index].config(bg=color)
if tick == 0:
self._pulse_job = self.root.after(400, self.pulse_winning_line, 1)
else:
self._pulse_job = None
Samoplanowanie after() — Znany trik z rozdziału 16
Ta sama technika self-rescheduling, co w rozdziale 16.22: każde wywołanie
pulse_winning_line sam planuje kolejny tick through after()dopóki nie osiągnie limitu, pętla zdarzeń nie jest blokowana przez chwilę.Odwołaj zaplanowany after() nowej rundy
Jeśli gracz kliknie „Nowa runda”
after() już działa na pustym polu nowej rundy. cancel_pulse() przyczyny after_cancel() przed resetem obowiązuje ta sama dyscyplina trzech stanów co timer w sekcji 16.28.cancel_pulse.py
def cancel_pulse(self):
if self._pulse_job is not None:
self.root.after_cancel(self._pulse_job)
self._pulse_job = None
Żadnego time.sleep(): jeden spokojny przejście
Efekt nie miga w serii: linia otrzymuje miękki efekt accent-color i po 400 ms pozostaje w stałym podświetleniu zwycięstwa. Nawet krótkie efekty powinny być dyskretne i nie rozpraszać statusu „Player X/O won”
Praktyka: Dyskretna animacja zwycięstwa
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie