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

标签 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 可以使用它们?

蒂亚

<小时/>

编辑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. 即使对于极少数被认可的人来说,表演也还有很多不足之处......

我想阅读更好、更有用的答案。

最佳答案

{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我看到的是有关该发行版的信息文章列表。

更新

写到第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/

相关文章:

python - 如果选择全部并按下删除或退格按钮,则条目 Tkinter 不允许删除数据

vim - 设置 MacVim 默认字体

vb6 - 如何在 Visual Basic 6 PictureBox 中制作非常小的字体大小?

python - 加快 Pandas 中 csv 文件的条件行读取速度?

python - 类型错误 : __init__() got an unexpected keyword argument 'trainable'

python - 如何将 tkinter ListBox 转换为列表?

c++ - 如何加载自定义字体以便我可以在 DirectX 中使用它们?

Python:无法导入名称/IndexError:列表索引超出范围

python - WebRTC Python 实现

python - 将滚动条放在 Canvas 上的框架上