20090317

Нормальный русский шрифт в Tk-приложениях

Обновление: запись частично устарела, python-tk 2.5 уже давно в Debian stable. Так что пересобирать пакеты самостоятельно теперь не надо.

Как известно, есть такая библиотека для графических интерфейсов, Tk. На Tcl/Tk легко писать скрипты с графическим интерфейсом. Так же Tk используется в качестве стандартной (доступной по умолчанию на всех платформах и не требующей установки) графической библиотеки в Python. Приложений написанных с использованием Tk довольно много. Раз читаете этот пост — значит, видели (смотрим, например, aptitude search ~Dpython-tk и aptitude search ~D^tk).

Однако русским пользователям Debian и Ubuntu с Tk явно не повезло. По умолчанию, из коробки, русские буквы в ней отображаются очень криво. Вот, к примеру простейшее приложение-однострочник:
$ echo 'button .b -text "привет, world!" ; pack .b ' | wish
и наблюдаем вот такой результат:



Хороших слов для таких шрифтов не находится. Такое ощущение, русские буквы берутся из какого-то китайского шрифта, при этом никакого сглаживания и хинтинга. Проблема настолько острая, что даже разобрана в LOR Wiki. В случае Tcl/Tk достаточно начать использовать Tk 8.5 вместо 8.4. В Debian/Ubuntu это делается так:
$ sudo update-alternatives --config wish 

Есть 3 альтернатив, которые предоставляют `wish'.

Выбор Альтернатива
-----------------------------------------------
* 1 /usr/bin/wish8.4
+ 2 /usr/bin/wish-default
3 /usr/bin/wish8.5

Нажмите enter, чтобы сохранить значение по умолчанию[*], или введите выбранное число: 3
Используется `/usr/bin/wish8.5' для предоставления `wish'.
Повторяем наш проверочный пример, и получаем вполне пристойный результат:



Понятно, что перед этим нужно поставить пакеты tcl8.5 и tk8.5. Это минутное дело.

Однако приложениям на Python, использующим Tk, вышеописанный фокус не поможет. В Debian (Lenny) и Ubuntu (Hardy, Intrepid) пакет python-tk собран с поддержкой только tk8.4, то есть по-умолчанию такие приложения выглядят вот так:



Чтобы это исправить, нужно поставить пакет python-tk собранный с поддержкой Tk 8.5. В Debian такой пакет есть, но только в experimental. Я скачал оттуда pytnon-tk 2.5.4-1 и нужный ему blt 2.4z-4 вручную и поставил. Никаких лишних зависимостей они не тянут, а Tk-приложения обретают новую жизнь:



В Ubuntu (Intrepid) ситуация похожая. Пакет python-tk собранный с Tk 8.5 повляется лишь в Jaunty. И сразу python-tk 2.6.1-0ubuntu1. Конечно, в таких случаях религия предписывает пересобирать пакет самостоятельно.