Rozdział 16 · Tworzenie fajnych aplikacji z Tkinter
Walidacja i informacja zwrotna
Surowy tekst użytkownika nie staje się liczbą sam w sobie — musi być między nimi sprawdzenie.
Walidacja – przed liczeniem
tekst użytkownika
entry.get()
pusty? Nie ma numeru? Negatywny?
↓walidacja
↓
uzasadnione?
nie — zrozumiały błąd
↓wiadomość do użytkownika
tak — konwersja
↓wartość liczbowa
↓
Funkcja dziedziny
Podgląd try/except
To jest minimalna praktyczna zapowiedź
try/except. Na razie użyjmy go jako gotowego szablonu do sprawdzania danych użytkowników. Wyjątki zostaną szczegółowo omówione w rozdziale 21.parse_number.py
def parse_number(text):
text = text.strip()
if not text:
return False, None, „Pole nie może być puste"
try:
return True, float(text), ""
except ValueError:
return False, None, „Wprowadź numer”
print(parse_number("")) # (False, None, ...)
print(parse_number("abc")) # (False, None, ...)
print(parse_number("-5")) # (True, -5.0, '') – liczba ujemna to LICZBA!
print(parse_number("100")) # (True, 100.0, '')
Nie każda liczba musi być dodatnia
parse_number sprawdza tylko „czy to w ogóle liczba?” — i celowo akceptuje wartości ujemne i zero: one też są liczbami. Na przykład temperatura w stopniach Celsjusza może być ujemna (rozdział 16.27) — wymaganie „dodatnie” jest specyficzne dla konkretnego zadania (sumy pieniędzy, liczba osób), a nie cechą liczb ogólnie.Specjalistyczna walidacja na parse_number
validate_positive.py
def validate_positive_amount(text):
ok, value, message = parse_number(text)
if not ok:
return False, message
if value <= 0:
return False, „Liczba musi być większa od zera"
return True, ""
def validate_positive_int(text):
ok, value, message = parse_number(text)
if not ok:
return False, message
if value != int(value):
return False, „Wprowadź liczbę całkowitą”
if int(value) < 1:
return False, „Liczba musi wynosić co najmniej 1”
return True, ""
Różne zadania — różne funkcje
Kwota rachunku musi być dodatnia —
validate_positive_amount. Liczba osób musi być dodatnia całość — validate_positive_int dalsze odrzucenia 2.5. Obie funkcje ponownie wykorzystują parse_number, a nie powielają analizę tekstu.Jak pokazać błąd użytkownikowi
status_label.py
ok, message = validate_positive_amount(schet_entry.get())
if not ok:
status_label.config(text=message, foreground="#DB2777")
return
Błąd — na ekranie, a nie tylko w terminalu
GUI- użytkownik zazwyczaj nie patrzy na terminal. Pokaż błąd za pomocą widżetu statusu lub
messagebox.showerror(...) (Rozdział 16.18) - Pieczęć print(...) do terminala nie jest uznawane za informację zwrotną dla użytkownika w aplikacji okienkowej.Trochę głębiej: validatecommand
Tkinter ma wbudowany mechanizm walidacji na poziomie widgetu
(validate=, validatecommand=,
register(...)) — jego składnia nie jest najbardziej intuicyjna, więc
Dla większości formularzy w tym kursie wystarczy ręczne sprawdzenie przed obliczeniem, jak wyżej.
Praktyka: parse_number i specjalistyczna walidacja
Testowane bez tkinter – na czystych funkcjach