【问题标题】:Python3 with PyQt5 on Win10 ignores font settingsWin10 上的 Python3 和 PyQt5 忽略字体设置
【发布时间】:2021-01-20 13:54:26
【问题描述】:

在我的程序GeigerLog 中,我使用固定宽度的字体来轻松格式化表格数据。在 Linux 下运行良好,在 Windows 下运行良好,但最近在 Win10 中出现问题。

这是某些输出在 Win 和 Linux 上的样子,在 Linux 上仍然是这样的:

但这就是它现在在 Windows10 上的样子:

显然,使用了(未知的)比例字体,并且格式消失了。然而,Python 代码错误地确认即使在 Win10 上也使用了“Courier New”。这是想要的,但事实并非如此!

我尝试了 Python 3.7.3,然后是 Python 3.8.6,并尝试了 PyQt5 的最后 5 个版本(5.14.0、5.14.1、5.14.2、5.15.0、5.15.1) - 都显示相同错误的行为。

下面是相关部分的代码摘录,打印输出添加为 cmets。我定义了字体,将它应用到 NotePad 小部件,然后用 fontInfo() 检查这个小部件。在 Win10 上也确认了正确的固定宽度字体。

不过,这不是Win10上使用的,见上面的截图。

发生了什么事?我需要说服谁去做,是 Win10、Python3 还是 PyQt5?怎么做?

import platform
print("platform()",        platform.platform())        # -> Windows-10-10.0.18362-SP0
print("machine()",         platform.machine())         # -> AMD64
print("architecture()[0]", platform.architecture()[0]) # -> 64bit

#QMainWindow class
...
# font standard
    self.fontstd = QFont()
    self.fontstd.setFamily('Monospace')
    self.fontstd.setFixedPitch(True)
    self.fontstd.setPointSize(10)
    self.fontstd.setBold(False)
    self.fontstd.Weight(QFont.Black)
...
# NotePad
    self.notePad = QTextEdit()
    self.notePad.setFont(self.fontstd)
...
    print("family():",     self.notePad.fontInfo().family())     # -> Courier New
    print("fixedPitch():", self.notePad.fontInfo().fixedPitch()) # -> True

【问题讨论】:

  • 试试看:self.fontstd = QFont("Consolas", 10)
  • 不,那没有用。也没有将“Courier New”定义为字体,我验证两者都在系统上并且可以使用。但它让我有了进一步测试的想法,结果令人惊讶;评论太复杂了,我会发一个帖子。

标签: python-3.x linux windows fonts pyqt5


【解决方案1】:

虽然@S.Nick 的评论不起作用,但它让我做了一些测试,结果令人惊讶。

只使用这 3 行来定义 fonststd:

self.fontstd = QFont("Consolas", 10)
self.fontstd.setFamily('Monospace')
self.fontstd.setFixedPitch(True)

导致错误的比例字体,但 PyQt5 告诉我它使用 Courier New。与使用 QFont empty 的结果完全相同,例如 self.fontstd = QFont()

用 Monospace 删除行:

self.fontstd = QFont("Consolas", 10)
self.fontstd.setFixedPitch(True)

我得到一个固定宽度的字体,PyQt5 说它是 Consolas!再次使用空的QFont(),我又回到了比例字体,PyQT5 假装它是 Courier New。

使用像“Times”这样的比例字体:

self.fontstd = QFont("Times", 10)
self.fontstd.setFixedPitch(True)

因此第二行与第一行冲突,使用了喜欢的 Times(或类似 Times),但 PyQt5 仍然假装它正在显示 Courier New!

仅使用行:

self.fontstd = QFont("Consolas", 10)

确实使用了固定宽度的字体,PyQt5 说它是 Consolas。

所以,某处存在错误;我猜它在 PyQt5 中?

作为一种解决方法,我现在需要区分 Windows 和 Linux(以及 Mac?),我希望 Qt 可以避免这种情况。

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2018-10-11
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多