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
Wprowadzanie nie zamienia się samo w liczbę — między łańcuch znaków a obliczeniem jest sprawdzenie.
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
Otwórz praktykę →