Уведомление tkinter Anaconda о системных шрифтах или установка новых шрифтов для Anaconda

У меня есть две установки Python на моем ноутбуке Debian Sid: ⑴ системный Python (v.2.7) с небольшим набором служебных пакетов (включая Tkinter) и ⑵ Anaconda Python 3.

Легко увидеть, какие (ну, вот сколько...) шрифты доступны для двух дистрибутивов Python.

Питон 2

>>> from Tkinter import Tk
>>> from tkFont import families
>>> Tk(); available = families()   ### Tk() is needed to have a running tcl interpreter
<Tkinter.Tk instance at 0x7f977bcbfb90>
>>> len(available)
3011

Питон 3

>>> from tkinter import Tk
>>> from tkinter.font import families
>>> Tk() ; available = families()
<tkinter.Tk object .>
>>> len(available)
68

Мне кажется, что Anaconda tkinter смотрит только на основные шрифты X, поставляемые с дистрибутивомсм. правку ниже.

Знаете ли вы процедуру, альтернативно

  • сообщить tkinter Anaconda о системных шрифтах (предпочтительная альтернатива) или
  • установить несколько шрифтов в дереве Анаконды, чтобы tkinter мог их использовать?

Тиа


Редактировать шрифты, доступные для Anaconda, действительно являются системными шрифтами, но только шрифтами, известными xfontsel, т. е. шрифтами в пути к шрифту, которыми можно манипулировать с помощью xset.

Я попробовал следующее

$ cd ~/.fonts ; mkfontscale ; mkfontdir ; xset fp+ `pwd`

а xfontsel показало еще около 30 семейств шрифтов. Проверяя с помощью Python 3, я убедился, что только два семейства шрифтов были добавлены в список доступных шрифтов (а именно 'go' и 'gomono' — без 'consolas' и т. д.) и создали метку

...
r = Tk() ; Label(r, text="Go Mono", font=('gomono', 24)).pack()

с Python 2 и Python 3 преуспели в обоих случаях, но Debian Python показал хороший сглаженный текст, в то время как другой был (грубым) представлением растрового изображения.

Так что в каком-то смысле я частично ответил на свой вопрос, но

  1. не каждое семейство шрифтов, как показано xfontsel, использовалось tkinter
  2. даже для очень немногих, которые были признаны, исполнение оставляет желать лучшего...

и я хотел бы прочитать лучший, более полезный ответ.


person gboffi    schedule 12.12.2017    source источник
comment
Я подозреваю, что ваша проблема аналогична тому, что описано в следующем вопросе: Path к шрифтам Linux в Python3 и tkinter   -  person PicoutputCls    schedule 12.12.2017
comment
@PicoutputCls Я вижу, вопросы, мягко говоря, похожи ... Однако я собираюсь оставить свой вопрос опубликованным, потому что я чувствую, что заголовок вопроса более актуален и может привлечь больше ответов, что вы думаете?   -  person gboffi    schedule 12.12.2017
comment
Согласованный. Я просто сослался на этот пост, потому что подумал, что он может помочь вам или кому-то еще найти решение проблемы.   -  person PicoutputCls    schedule 12.12.2017
comment
Существует ли переменная среды FONTCONFIG_PATH/FONTCONFIG_FILE? Вы можете проверить что-то вроде 'FONTCONFIG_PATH' in os.environ?   -  person CommonSense    schedule 12.12.2017
comment
@CommonSense Я проверил, нет подходящей (очевидно, связанной с fontconfig) переменной среды.   -  person gboffi    schedule 12.12.2017


Ответы (2)


{tT}kinter работает с интерпретатором Tk/Tcl, который, грубо говоря, содержится в паре DLL, в частности графической библиотеке libtk6.0.so.

Большинство дополнительных шрифтов, не видимых tkinter, управляются библиотекой Freetype, а libtk6.0.so Anaconda не поддерживает Freetype...

$ ldd /usr/lib/x86_64-linux-gnu/libtk8.6.so | grep freetype
        libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f0a24597000)
$ ldd miniconda3/lib/libtk8.6.so | grep freetype
$

Я пробовал следующее, ужасная вещь

$ mv lib/miniconda3/lib/libtk8.6.so lib/miniconda3/lib/libtk8.6.sav
$ ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so lib/miniconda3/lib/libtk8.6.so
$ ipython
Python 3.6.3 |Anaconda, Inc.| (default, Nov 20 2017, 20:41:42) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from tkinter import Tk, Label ; from tkinter.font import families
In [2]: r = Tk() ; a = families() ; len(a)
Out[2]: 328
In [3]: r=Tk() ;  Label(r, text="Constantia", font=("Constantia", 60)).pack()
In [4]: r.mainloop()

введите описание изображения здесь

Последние мысли.

  1. Замена DLL не является чистым решением.
  2. Шрифты не совсем одинаковые. Наверняка в Анаконде есть своя подсистема Fontconfig и, возможно, каталоги, которые сканируются, разные, но у меня нет правильного понимания несоответствия в количестве шрифтов.
  3. Правильный план действий — убедить Anaconda, Inc. построить libtk против Freetype, но я не знаю, как сообщить им, например, если я зайду на https://www.anaconda.com/search/issues я вижу список информационных статей о раздаче.

Обновлять

Что касается пункта 3, я связался через ошибку github Anaconda Inc. , и мне сказали

Нет, мы не можем этого сделать. При создании нашего программного обеспечения нам нужно, чтобы Python был собран очень рано, задолго до того, как будет построено что-либо графическое. Добавление Freetype в качестве dep для tkinter вызывает цикл в графе сборки, и мы больше не можем собрать дистрибутив.

Почему бы не использовать что-то более современное, чем tkinter?

--- Рэй Доннелли (он же mingwandroid)

person gboffi    schedule 13.12.2017
comment
Я нашел подходящий канал и опубликовал свои выводы в следующем выпуске: tkinter fonts #6833 - person gboffi; 13.12.2017
comment
Я также разместил в пакет tk, похоже, построен без поддержки truetype #776, это кажется еще более актуальным и отслеживается (было?) разработчиком дистрибутива. - person gboffi; 13.12.2017
comment
Ух ты. Ответ, который вы получили, одновременно полезен и оскорбителен. Боже. - person erekalper; 22.03.2018
comment
@erekalper Полезно, поскольку они ясно дают понять, что не собираются решать проблему. С другой стороны, я подозреваю, что достоинство ответа б.с. но мне не хочется вести дискуссию с человеком, который так смело отстаивает свою позицию. - person gboffi; 25.03.2018

EDIT: как указал @gboffi, это решение только кажется работает, поскольку sudo python использует не установку Anaconda, а систему по умолчанию. Использование полного пути Anaconda Python с sudo по-прежнему дает ограниченные параметры шрифта. Я собираюсь продолжать исследовать это, но этот ответ в его нынешнем виде явно неверен.


У меня была почти такая же проблема, и «исправление» для меня заключалось в том, чтобы запустить Anaconda Python с sudo. Это, по-видимому, дает ему доступ к остальным шрифтам, которых по какой-то причине у него изначально нет. (Нашла эту информацию в малонаселенном обсуждении групп Google< /а>.)

Для справки, моя система работает под управлением Ubuntu 16.04 и Anaconda 4.4.8 с Python 3.6.4.

python my_script.py дает:

Семейства шрифтов без sudo

в то время как sudo python my_script.py дает:

Семейства шрифтов с sudo

Как ни странно, они не пересекаются, но на данный момент я достаточно расстроен Анакондой, поэтому на данный момент я закончил расследование. Надеюсь, это (возможно) поможет! Это плохое решение, достаточно хорошее для тестирования.

person erekalper    schedule 21.03.2018
comment
sudo python script запускает системный Python, который правильно построен с учетом fontconfig и truetype. Боюсь, я не могу проголосовать за ваш ответ... - person gboffi; 24.03.2018
comment
Вы абсолютно правы; это полная оплошность с моей стороны (и довольно глупая к тому же). Я собираюсь продолжить изучение этого, но обновлю свой ответ. - person erekalper; 26.03.2018