13

我在我的 Debian Sid 笔记本上安装了两个 Python,⑴ 系统的 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 字体,请参阅下面的编辑

你知道一个程序,或者

  • 让 Anacondatkinter知道系统字体(首选替代方案)或
  • 在 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. 即使对于极少数被认可的人来说,这种演绎也有太多不足之处......

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

4

3 回答 3

10

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

大多数没有看到的额外字体tkinter由 Freetype 库管理,而 Anacondalibtk6.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()

在此处输入图像描述

最后的想法。

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

更新

Wrto point 3,我通过github issue Anaconda Inc. 联系了我,我被告知

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

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

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

于 2017-12-13T07:35:48.613 回答
-1

我正在通过在无 conda 的环境中启动 gitk 来解决这个问题。我对 conda 很陌生,所以我不知道这样做是否存在微妙/隐藏的问题。

# Fix gitk fonts in conda environments
# The Tcl/Tk environment in conda has font linking issues, so hard-to-read fonts get chosen
# Start a subshell ( ), any changes within will die with the subshell
# Detect if conda is active, if so deactivate until it isn't
# Run gitk in a conda-free environment
alias gitk='( [ -n "${CONDA_SHLVL}" ] && while [ $CONDA_SHLVL -gt 0 ]; do conda deactivate; done; gitk --all & )'
于 2021-10-05T16:28:50.227 回答
-2

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


我遇到了几乎完全相同的问题,对我来说“修复”是使用sudo. 这样做显然可以访问其他字体,无论出于何种原因,它本身没有。(在人烟稀少的Google Groups 讨论中找到此信息。)

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

python my_script.py产量:

没有 sudo 的字体系列

同时sudo python my_script.py产生:

带有 sudo 的字体系列

奇怪的是它们没有重叠,但我对 Anaconda 感到非常沮丧,我现在已经完成了调查。希望这(也许)有帮助!这是一个糟糕的解决方案,足以进行测试。

于 2018-03-21T21:21:19.850 回答