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

时间:2017-12-12 09:29:06

标签: python tkinter fonts anaconda fontconfig

我在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

Python 3

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

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

你知道一个程序,或者

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

TIA

编辑 Anaconda可用的字体确实是系统字体,但只有xfontsel已知的字体,即字体路径中可以使用{{{{1}操作的字体1}}。

我尝试了以下

xset

$ cd ~/.fonts ; mkfontscale ; mkfontdir ; xset fp+ `pwd` 显示了大约30多个字体系列。使用Python 3进行检查我确认只有两个字体系列被添加到可用字体列表中(即xfontsel'go' - 没有'gomono'等)并生成标签

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

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

  1. 并非所有字体系列(... r = Tk() ; Label(r, text="Go Mono", font=('gomono', 24)).pack() 所示)都被xfontsel
  2. 占用
  3. 即使对于被认可的极少数人来说,引渡还有太多不足之处......
  4. 我希望阅读更好,更有用的答案。

2 个答案:

答案 0 :(得分:4)

{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
$

我尝试了以下,可怕的事情

$ 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()

enter image description here

最后的想法。

  1. 替换DLL不是一个干净的解决方案。
  2. 字体不完全相同。肯定Anaconda有自己的Fontconfig子系统,可能扫描的目录不同,但我对字体数量的差异没有正确的理解。
  3. 正确的行动方案是说服Anaconda,Inc。针对Freetype建立libtk,但我不知道如何向他们报告,例如,如果我去https://www.anaconda.com/search/issues我是什么意思请参阅有关分发的信息文章列表。
  4. 更新

    W.r.to第3点,我通过a github issue Anaconda Inc.联系我,我被告知

      

    不,我们不能这样做。构建我们的软件时,我们需要尽早构建python,在构建任何图形之前。将Freetype作为tkinter的dep添加会导致构建图中的循环,我们无法再构建发行版。

         

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

         

    --- Ray Donnelly(又名mingwandroid)

答案 1 :(得分:-1)

编辑:正如@gboffi所指出的那样,这个解决方案只有似乎就像它有效一样,因为sudo python并没有使用Anaconda&#39; s安装,而是系统默认。使用带有sudo的完整Anaconda Python路径仍会产生有限的字体选项。我将继续探索这个问题,但这个答案显然是不正确的。

我几乎遇到了完全相同的问题,并且&#34;修复&#34;对我来说,用sudo运行Anaconda的Python。这样做显然可以让它访问其余的字体,无论出于什么原因,它本身都没有。 (在人口稀少的Google Groups discussion中找到此信息。)

作为参考,我的系统运行的是Ubuntu 16.04,Anaconda 4.4.8运行的是Python 3.6.4。

python my_script.py收益:

Font families without sudo

sudo python my_script.py产生:

Font families with sudo

奇怪的是他们并没有重叠,但我现在对Anaconda感到很沮丧,我现在正在调查。希望这(也许)有帮助!这是一个不错的解决方案,足以进行测试。