Глава 16 · Создаём классные приложения с Tkinter

Focus, клавиатура и основы доступности

Не у каждого пользователя мышь — а понятная форма должна работать и без неё.

Фокус ввода

Клавиатурный ввод всегда идёт только одному виджету — тому, у которого сейчас фокус:

focus.py
entry.focus_set()      # передать фокус этому полю программно
print(root.focus_get())   # какой виджет в фокусе сейчас
Готовим почву для главы 17
Фокус — важное понятие для дальнейшей работы с клавиатурными событиями (.bind("<Key>", ...)), которые подробно разберём в главе 17.

Порядок перехода между полями (Tab)

Пользователь должен уметь заполнить форму, используя только клавиатуру — переходя между полями клавишей Tab в разумном порядке.

Порядок Tab — не просто «в порядке создания»
Клавиатурный обход следует правилам обхода фокуса Tk по дереву виджетов и их положению, а также тому, участвует ли конкретный виджет в получении фокуса вообще (параметр takefocus). Порядок создания влияет на естественную структуру простой формы, но не является полным правилом. Практический beginner-совет: стройте элементы формы в логичном порядке, обязательно проверяйте переход по Tab вручную, избегайте лишних фокусируемых виджетов и используйте takefocus осознанно там, где нужно явно включить или исключить виджет из обхода.

Основы доступности

Небольшой, но настоящий список
Метки
у каждого поля — видимая подпись
не только текст-заглушка (placeholder)
Состояние
не только цветом — текстом/иконкой тоже
disabled — когда действие недоступно
Клавиатура
разумный порядок Tab
не только мышь как единственный путь
Сообщения
понятный текст ошибки
что пошло не так и как исправить
Tkinter сам не решает доступность за вас
Использование Tkinter не гарантирует доступный интерфейс на всех платформах автоматически. Перечисленные принципы — то, что зависит от решений в вашем коде и разметке, а не от самого факта использования 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)
Практика: проверка доступности формы
Проверяется без tkinter — на модели формы как списка данных
Открыть практику →