Tkinter - python 版本之间字体清晰度的差异

问题描述 投票:0回答:1

我有一个

tkinter
GUI 应用程序,可以与 python 3.6.0 版本配合使用。

当我升级到 python 3.10.6 版本时,小部件的文本变得非常模糊。

当我进行比较时,我发现 python 3.6 版本中的字体清晰度比 python 3.10 中的要好得多。
(附图)

如何解决这个问题?

Comparison

左 - 3.6.0
右 - 3.10.6

python-3.x tkinter rendering font-size
1个回答
0
投票

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。

  • 由于问题出在您的操作系统上,也许禁用抗锯齿功能。我知道在 Windows 上您需要输入 Win+R,然后输入

    systempropertiesperformance.exe

    ,然后取消选中“屏幕字体的平滑边缘”,但您肯定可以在 Linux 上找到相同的修复方法。我不会为你这样做,因为我很可能是错的,没有运行 Linux 发行版。

Windows 10 上的工作结果:

© www.soinside.com 2019 - 2024. All rights reserved.