Глава 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 — на модели формы как списка данных