Python 3.14.7: non-BMP className в Tk даёт ValueError, а не crash. Практическая инструкция отделяет симптом от соседних причин: синтетический fixture, отрицательный control, таблица наблюдений, критерий остановки и минимальный пакет для поддержки без production-данных.
Развилка до обновления
Короткая развилка: изменение действительно вошло в Python 3.14.7 — Для Tcl/Tk 8.x такой className теперь отклоняется ValueError вместо segfault; это не обещание одинакового поведения Tk 9. Но похожий внешний симптом может иметь другую причину. Здесь проверяется только боль «Имя класса окна содержит символ вне BMP, сборка связана с Tcl/Tk 8.x, и конструктор Tk ранее мог аварийно завершить весь интерпретатор.» и только запрос «как проверить tkinter Tk className с non-BMP символом на Tcl/Tk 8 в Python 3.14.7». Не переносите вывод на производительность, безопасность всего приложения или совместимость всех зависимостей: для этого нужны отдельные тесты и отдельные источники.
Сбор измеримых фактов
Практическая проверка T22-14 строится вокруг одного действия: в отдельном GUI child process вызвать Tk(className=...) с одним синтетическим non-BMP символом и немедленно уничтожить root, если он всё же создан. Подготовьте новый fixture для каждого повтора и пометьте события монотонным временем. Сначала соберите факт о build/runtime capability, затем — результат API. Не подменяйте недоступную среду похожей ОС или другим устройством: это уже новый вопрос, а не подтверждение текущего.
Матрица A/B/A2
Матрица решения включает три ветки. Первая — сравнить ASCII className, BMP Unicode className и non-BMP className, предварительно записав Tcl patchlevel. Вторая — target с тем же input, третья — повтор первой в новом процессе. Поля: «Tk version | class category | constructor result | exception class | child exit | root destroy marker». Сначала сравните capability и вход, потом exception/exit, и лишь затем делайте вывод. Это защищает от ложного зелёного статуса из-за cache, warmed state или случайного timing.
Когда вывод относится к issue
Ветка считается подтверждённой только когда ASCII и допустимый BMP проходят control, а non-BMP на Tk 8 завершается ValueError без сигнала и core dump. Если версия ведёт себя иначе, сохраните наблюдение без попытки объяснить его догадкой. Причиной могут быть backport, vendor patch, build option или тестовая ошибка. Отдельно пометьте, какой control отвергнут; это полезнее общего вывода «не работает».
Наблюдаемый rollback
Красный сигнал: не встраивать тест в рабочий GUI; прекратить сравнение, если нет display или фактическая версия Tk не соответствует проверяемой границе. Также завершайте child по watchdog, если он не достиг следующего marker. Возврат должен быть наблюдаемым: temp root пуст, сетевой stub закрыт, terminal/GUI state восстановлен, системный Python и environment не менялись. Такой rollback важнее попытки получить красивый passed.
Что передать сопровождающим
Если нужна помощь сопровождающих, подготовьте: версии Python/Tk, Unicode category без реального имени приложения, три результата конструктора и child exit code. Добавьте итоговый статус passed / not reproduced / blocked / failed control и одну строку об очистке. Не выдавайте форумный лид за факт: change boundary подтверждается release, changelog и первичной issue, а не количеством комментариев.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #126219 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.