我有一个
tkinter
GUI 应用程序,可以与 python 3.6.0 版本配合使用。
当我升级到 python 3.10.6 版本时,小部件的文本变得非常模糊。
当我进行比较时,我发现 python 3.6 版本中的字体清晰度比 python 3.10 中的要好得多。
(附图)
如何解决这个问题?
左 - 3.6.0
右 - 3.10.6
Tkinter 似乎已决定开始在操作系统上支持 Python 3.6 和 3.10 之间的 抗锯齿。然而,这种抗锯齿支持似乎依赖于平台。例如,在我的 Windows 10 PC 上,我也获得了一些抗锯齿功能,但渲染并不那么模糊:
可能的修复:
使用不具有抗锯齿功能的字体,例如
Minecraft
、FixedSys
、Pixellari
。
使用早期的 Python 版本删除 Tkinter 的抗锯齿支持。
您可以尝试此 MRE,并将渲染与
Label
s 或 Canvas
es 中的文本进行比较,如果其中一个更好,请使用它:
from tkinter import *
tk = Tk()
tk.title('Antialiasing comparison')
fonts = ['Helvetica', 'Arial', 'Times New Roman', 'Courier New', 'fixedsys']
sizes = [12, 20]
Label(tk, text='Labels', fg='blue').grid()
Label(tk, text='Canvas text', fg='blue').grid(column=1, row=0)
antialias = Frame(tk)
antialias.grid()
alias = Canvas(tk, width=400, height=sum(sizes)*len(fonts)*4)
alias.grid(column=1, row=1)
y = 15
for font in fonts:
for size in sizes:
for bold in [(), ('bold',)]:
b = ' bold' if len(bold) else ''
kwargs = {'text': '%s %d%s' %(font, size, b), 'font': (font, size)+bold}
# display antialiased labels in Frame
Label(antialias, **kwargs).pack()
# display aliased labels in Canvas
alias.create_text(200, y, **kwargs)
y += size*2
tk.mainloop()
如果您仍想使用较新的 Python 版本,请尝试在较新的 Python 上使用较旧的 Tkinter。您可以在 cpython
Github 存储库上下载较旧的 Python 和库文件。然后,您必须将
cpython-x.x.x/Lib/tkinter
提取到程序目录中,例如
oldtkinter
,并将其导入脚本中代替 Tkinter。
systempropertiesperformance.exe
,然后取消选中“屏幕字体的平滑边缘”,但您肯定可以在 Linux 上找到相同的修复方法。我不会为你这样做,因为我很可能是错的,没有运行 Linux 发行版。