Tkinter在Linux上没有正确显示Unicode字符

时间:2016-09-15 20:47:06

标签: python python-3.x unicode tkinter

虽然在Windows上tkinter似乎正确显示了字符,但在Linux上使用相同的代码却不会发生同样的情况。

我已经尝试了显示here的方法,在角色后面添加了.encode("utf-8"),但这只会使char变为两个系统上的线。我也尝试过复制和粘贴字符而不是使用unicode表示,虽然这适用于Windows,但对于Linux来说也是如此。

显示我的问题的代码片段:

# -*- coding: utf-8 -*-
from tkinter import *


master = Tk()
previous_button = Button(master,
                         text=u'\u23EE',
                         relief='flat',
                         activebackground='#282828',
                         activeforeground='#1DB954',
                         bg='#282828',
                         fg='#1DB954',
                         borderwidth=0,
                         bd=0,
                         highlightthickness=0,
                         font='arial 11',
                         )

next_button = Button(master,
                     text=u'\u23ED',
                     relief='flat',
                     activebackground='#282828',
                     activeforeground='#1DB954',
                     bg='#282828',
                     fg='#1DB954',
                     bd=0,
                     highlightthickness=0,
                     borderwidth=0,
                     font='arial 11',
                     )

previous_button.grid()
next_button.grid()

mainloop()

视窗: The buttons as seen on windows

Linux中: The same buttons on Linux

如何让tkinter在Linux上渲染这些unicodes?

3 个答案:

答案 0 :(得分:1)

字体“arial”不支持Linux安装上的unicode字符U + 23EE和U + 23ED。你能用字体管理器检查吗?

答案 1 :(得分:1)

Linux Mint机器上的Arial似乎不支持这些字符。

我建议在Linux上添加Windows中的字体。

这里有一个简单的指南: https://community.linuxmint.com/tutorial/view/29

此外,我建议在tkinter中使用扩展版本的font属性,如下所示:

button = Button(parent, text=u'\u23ED', font=('Font Name', size, 'decoration')

button = Button(parent, text=u'\u23ED', font=('Arial', 12, 'bold')

通过这种方式,您可以轻松支持名称中带有空格的字体。

答案 2 :(得分:1)

自2003年左右以来,所有现代Linux GUI工具包都支持字体替换(如果缺少字形,工具包将使用其他字体来完成所选字体),但是tk不是现代工具包,它是面向窗口的,而且很丑陋。 Linux,它在很大程度上错过了这一变化,不确定它目前是如何陷入困境的(参见fontconfig,harfbuzz-ng,pango)。

您需要确保安装了包含您需要的字形的字体(请在gucharmap中右键单击检查)。例如,在Linux上使用大编码的常见字体是Dejavu。

如果你的tk版本最终赶上了其余的工具包,它将透明地使用这个字体来完成你选择的那个。如果不是,您需要在代码中明确选择正确的字体。

您不太可能在Linux和Windows上找到常用字体。 Linux系统部署免费和开放字体,Microsoft部署具有限制许可的专有字体。您在系统上找到的Arial可能是一个过时的不完整的错误版本,具有可疑的许可,大多数Linux版本都拒绝部署。不要指望它存在于其他地方,如果你想避免法律问题,不要让别人部署它。

相反,您在Linux上找到的大多数字体都可以在Windows上无限制地部署,但默认情况下不会。在做出最终选择之前,请检查您要使用的字体的许可证。