Debugowanie interfejsu i jakość GUI
Responsywność interfejsu nie jest automatyczną konsekwencją korzystania z Tkinter, lecz wynikiem konkretnych decyzji w kodzie.
Pętla zdarzeń nie może być wypożyczona przez długi czas
import time
def on_click():
time.sleep(5) # „czekać 5 sekund”
label.config(text=„Gotowe!”)
# На все 5 секунд окно перестаёт перерисовываться и реагировать на клики —
# событийный цикл заблокирован внутри time.sleep(), а не только сам callback.
time.sleep(...) zatrzymuje cały proces, w którym działa pętla zdarzeń — a Tkinter zwykle działa w jednym wątku. Gdy wątek śpi, pętla nie może obsłużyć w ogóle niczego: ani przerysowania, ani kliknięć, ani zamknięcia okna.
def on_click():
label.config(text=„Czekamy...”)
root.after(5000, lambda: label.config(text=„Gotowe!”))
# pętla zdarzeń trwa przez te wszystkie 5 sekund
while True:
if button_nazhata():
obrabotat_klik()
# Такого кода не должно быть в Tkinter-приложении вообще —
# у Tk уже есть собственный событийный цикл внутри mainloop().
Tkinter już zapewnia pełnoprawną pętlę zdarzeń. Niestandardowe while True dla „pollowania”
button.config(command=obrabotat_klik)
root.mainloop() # c obsługuje zdarzenia, w tym kliknięcia na button
def on_click():
result = obrabotat_million_zapisej() # sekundy obliczeń wewnątrz callback
label.config(text=str(result))
# Интерфейс "подвисает" на всё время вычисления — ровно так же,
# как и с time.sleep(), просто по другой причине.
Każda czasochłonna operacja w callback nie jest tylko time.sleep() — zajmuje cykl zdarzeń na cały ten czas. Dla naprawdę długich zadań: dzielić pracę na części, planowane przez after(), czyli przeniesienie go do osobnego wątku/procesu z bezpiecznym powrotem wyniku, to już zaawansowany temat, który nie wymaga pełnej implementacji w tym kursie.
def obrabotat_chast(indeks):
if indeks >= len(dannye):
label.config(text=„Gotowe”)
return
obrabotat_odnu_zapis(dannye[indeks])
root.after(0, obrabotat_chast, indeks + 1) # następna część jest o kolejnym cyklu
Testowanie tego, co można przetestować bez okna
def test_calculate_tip():
assert calculate_tip(100, 10, 2) == 5.0
test_calculate_tip()
print(„Logika domeny sprawdzona bez pojedynczego widżetu.”)