我的 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
可以使用它们?
蒂亚
<小时/>编辑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 显示了很好的抗锯齿文本,而另一个是(粗糙的)位图再现。
所以,从某种意义上说,我已经部分回答了我的问题,但是
- 并非所有字体系列(如
xfontsel
所示)都被tkinter
所采用 - 即使对于极少数被认可的人来说,表演也还有很多不足之处......
我想阅读更好、更有用的答案。
最佳答案
{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()
最后的想法。
- 替换 DLL 并不是一个干净的解决方案。
- 字体不完全相同。当然Anaconda有自己的Fontconfig子系统,可能扫描的目录不同,但我对字体数量的差异没有正确的理解。
- 正确的做法是说服 Anaconda, Inc. 针对 Freetype 构建
libtk
,但我不知道如何向他们报告,例如,如果我转到 https://www.anaconda.com/search/issues我看到的是有关该发行版的信息文章列表。
更新
写到第3点,我通过a github issue联系有人告诉我和 Anaconda Inc.
No we cannot do this. When building our software we need python built very early, well before anything graphical gets built. Adding Freetype as a dep for tkinter causes a cycle in the build graph and we can no longer build the distro.
Why not use something more modern than tkinter anyway?
--- Ray Donnelly (aka mingwandroid)
关于python - 让 Anaconda 的 tkinter 了解系统字体或为 Anaconda 安装新字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47769187/