ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 让Anaconda的tkinter知道系统字体或为Anaconda安装新字体

2019-09-27 09:57:50  阅读:483  来源: 互联网

标签:python fonts tkinter 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已知的字体,即字体路径中可以使用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()

enter image description here

最后的想法.

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

更新

W.r.to第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,fonts,tkinter,anaconda,fontconfig
来源: https://codeday.me/bug/20190927/1823513.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有