Rozdział 16 · Tworzenie fajnych aplikacji z Tkinter

Focus, klawiatura i podstawy dostępności

Nie każdy użytkownik ma mysz — a zrozumiała forma powinna działać również bez niej.

Skupienie na wejściu

Wejście z klawiatury zawsze trafia tylko do jednego widżetu — tego, który obecnie ma skupienie:

focus.py
entry.focus_set()      # przenieść fokus do tego pola programowo
print(root.focus_get())   # który widżet jest teraz w fokusu
Przygotowanie gruntu pod rozdział 17
Skupienie to ważna koncepcja dla dalszej pracy z wydarzeniami klawiaturowymi (.bind("<Key>", ...)), który szczegółowo przeanalizujemy w rozdziale 17.

Kolejność przechodzenia między polami (Tab)

Użytkownik musi umieć wypełniać formularz wyłącznie za pomocą klawiatury – nawigując między nimi pola z kluczem Tab w rozsądny sposób.

Kolejność Tab to nie tylko „w porządku stworzenia”
Przesuwanie przez klawiaturę opiera się na zasadach przesuwania fokusów Tk drzewie widżetów i ich pozycji oraz tego, czy dany widget w ogóle jest zaangażowany w uzyskanie fokusu (the takefocus). Kolejność tworzenia wpływa na naturalną strukturę prostej formy, ale nie jest pełną zasadą. Praktyczna rada beginner-: buduj elementy formy w logicznej kolejności, koniecznie sprawdzone ręcznie przechodzić przez Tab, unikać niepotrzebnie skupionych widgetów i korzystać z nich takefocus świadomie, gdzie chcesz wyraźnie uwzględnić lub wykluczyć widget z indeksowania.

Podstawy dostępności

Mały, ale prawdziwy lista
Tagi
dla każdego pola — widoczna etykieta
nie tylko tekst-zastępczy (placeholder)
Status
nie tylko kolorem — także tekstem/ikonką
disabled — gdy działanie jest niedostępne
Klawiatura
rozsądna kolejność Tab
nie tylko mysz jako jedyna metoda
Wiadomości
zrozumiały tekst błędu
co poszło nie tak i jak to naprawić
Tkinter nie decyduje o dostępności dla ciebie
Użycie Tkinter nie gwarantuje automatycznie dostępnego interfejsu na wszystkich platformach. Wymienione zasady — to, co zależy od decyzji w Twoim kodzie i oznaczeniach, a nie od samego faktu używania biblioteki GUI-.
proverka_dostupnosti.py
forma = [
    {"name": "name_entry", "has_label": True, "tab_index": 0},
    {"name": "email_entry", "has_label": True, "tab_index": 1},
    {"name": "submit_button", "has_label": True, "tab_index": 2},
]

def vse_imeyut_metku(widgets):
    return all(w["has_label"] for w in widgets)

def poryadok_posledovatelen(widgets):
    indeksy = [w["tab_index"] for w in widgets]
    return indeksy == sorted(indeksy)
Praktyka: Sprawdź dostępność formularza
Zweryfikowane bez tkinter – na modelu formularza jako lista danych
Otwórz praktykę →