Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

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. Конечно, в таких случаях религия предписывает пересобирать пакет самостоятельно.

8 коммент.:

  1. Спасибо за статью! А то уже совсем достали ужасные шрифты в Idle (Python IDE).

    Но после того как я поставил python-tk 2.6.1-0ubuntu1, этот самый Idle перестал делать автодополнение текста и подсказки тоже изчезли :( Вместо них в консоли пишет жуткие


    File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1417, in __call__
    return self.func(*args)
    File "/usr/lib/python2.5/idlelib/AutoCompleteWindow.py", line 218, in winconfig_event
    x, y, cx, cy = self.widget.bbox(self.startindex)
    File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 2858, in bbox
    self.tk.call((self._w, 'bbox') + args)) or None
    File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1033, in _getints
    return tuple(map(getint, self.tk.splitlist(string)))
    ValueError: invalid literal for int() with base 10: '(87,'


    T_T

    ОтветитьУдалить
  2. Видно, всё таки нельзя ставить пакет python 2.6. То есть всё таки не работает. Жаль. То есть видно, надо честно пересобрать пакеты python.

    В качестве халявного варианта можно ещё попробовать поставить python-tk и blt из Debian. Они всё же 2.5 и почти тех же версий. Сейчас попробовал на машине с Intrepid, поставились и ничего моего не сломалось.

    Не знаю, как будет с IDLE.

    ОтветитьУдалить
  3. Поставил IDLE. Подтверждаю, проблема с автодополнением есть. Хорошо, что в IPython всё работает :-)

    ОтветитьУдалить
  4. А можно просто в иксах шрифты настроить... ох


    ~/.Xresources вам всем в руки!

    ОтветитьУдалить
  5. Рабочий конфиг в студию :) Только чтобы шрифт во всех приложениях был гарантированно вменяем. Не надо забывать, что некоторые пытаются определённые шрифты задавать.

    ОтветитьУдалить
  6. Олег8915/4/11 21:35

    Как же быть c модулем Perl Tkx в Windows? Довольно остро стоит проблема русского языка в моём приложении. Нужно прочитать русские данные из .csv, обработать (сохранить в хеше) и вывести в GUI.

    ОтветитьУдалить
  7. Здравствуйте, Олег. К сожалению, не могу вам подсказать. Perl с Tk я
    не использовал, и под виндоус тоже.

    2011/4/15 Disqus <>:

    ОтветитьУдалить