让Anaconda的tkinter了解系统字体或为Anaconda安装新字体

gbo*_*ffi 10 python fonts tkinter fontconfig anaconda

我在Debian Sid笔记本上安装了两个Python,⑴系统的Python(v.2.7)包含一些实用程序包(包括Tkinter)和⑵Anaconda 的Python 3.

很容易看出两个Python发行版可以使用哪些(好吧,这里有多少......)字体.

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
Run Code Online (Sandbox Code Playgroud)

Python 3

>>> from tkinter import Tk
>>> from tkinter.font import families
>>> Tk() ; available = families()
<tkinter.Tk object .>
>>> len(available)
68
Run Code Online (Sandbox Code Playgroud)

在我看来,Anaconda tkinter只关注分发附带的基本X字体,请参阅下面的编辑.

你知道一个程序吗?

  • 让Anaconda tkinter了解系统字体(首选替代品)或
  • 在Anaconda的树中安装一些字体,以便tkinter可以使用它们?

TIA


编辑 Anaconda可用的字体确实是系统字体,但只有已知xfontsel的字体,即可以使用的字体路径中的字体xset.

我尝试了以下内容

$ cd ~/.fonts ; mkfontscale ; mkfontdir ; xset fp+ `pwd`
Run Code Online (Sandbox Code Playgroud)

xfontsel展示了大约30多个字体系列.使用Python 3进行检查我确认只有两个字体系列被添加到可用字体列表中(即- 'go''gomono'no 'consolas'等)并生成标签

...
r = Tk() ; Label(r, text="Go Mono", font=('gomono', 24)).pack()
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,Python 2和Python 3都取得了成功,但Debian的Python显示了一个很好的抗锯齿文本,而另一个是(粗略的)位图再现.

所以,从某种意义上说,我已经部分回答了我的问题,但是

  1. 并非如图所示xfontsel,所有字体系列都被占用了tkinter
  2. 即使对于那些被认可的极少数人来说,这种表现还是有太多不足之处......

我想读一个更好,更有用的答案.

gbo*_*ffi 7

{tT}kinter链接到Tk / Tcl解释器的工作,松散地说,它包含在几个DLL中,特别是图形库是libtk6.0.so

大多数看不见的额外字体tkinter都由Freetype库管理,Anaconda的字体不是libtk6.0.so针对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
$
Run Code Online (Sandbox Code Playgroud)

我尝试了以下可怕的事情

$ 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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

最后的想法。

  1. 替换DLL并不是一个干净的解决方案。
  2. 字体不完全相同。当然,Anaconda具有自己的Fontconfig子系统,并且扫描的目录可能不同,但是我对字体数量的差异没有正确的了解。
  3. 正确的做法是说服Anaconda,Inc. libtk反对Freetype,但我不知道如何向他们报告,例如,如果我去https://www.anaconda.com/search/issues,我该怎么做?请参阅有关发行版的参考文章列表。

更新资料

第3点,我通过github问题 Anaconda Inc.与我联系,并被告知

不,我们不能这样做。在构建我们的软件时,我们需要非常早地构建python,远远早于构建任何图形。将Freetype添加为tkinter的dep会导致构建图中的一个循环,因此我们无法再构建发行版。

为什么不使用比tkinter更现代的东西呢?

                                                   ---雷·唐纳利(又名mingwandroid)

  • 哇。您得到的回复既有帮助又是侮辱性的。真是的 (4认同)
  • @erekalper 有帮助,因为他们明确表示他们不会解决问题。另一方面,我怀疑这个答案的优点是废话,但我不想与一个如此大胆地坚持自己立场的人进行讨论。 (2认同)