Python3 с PyQt5 на Win10 игнорирует настройки шрифта

#python-3.x #linux #windows #fonts #pyqt5

#python-3.x #linux #Windows #шрифты #pyqt5

Вопрос:

В моей программе GeigerLog я использую шрифт фиксированной ширины для некоторого упрощения форматирования табличных данных. Отлично работает в Linux, отлично работает в Windows, но недавно у меня возникли проблемы в Win10.

Это то, как некоторые выходные данные выглядели в Win и Linux, и все еще выглядят в Linux:

введите описание изображения здесь

но это то, что сейчас выглядит в Windows10:

введите описание изображения здесь

Очевидно, используется (неизвестный) пропорциональный шрифт, и форматирование исчезло. И все же код Python ошибочно подтверждает, что даже в Win10 используется ‘Courier New’. Это то, что желательно, но это не так!

Я попробовал Python 3.7.3, затем Python 3.8.6 и попробовал последние 5 версий PyQt5 (5.14.0, 5.14.1, 5.14.2, 5.15.0, 5.15.1) — все они демонстрировали одно и то же неправильное поведение.

Ниже приведен отрывок кода для соответствующих частей, с выводом на печать, добавленным в качестве комментариев. Я определяю шрифт, применяю его к виджету 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
  

Комментарии:

1. попробуйте: self.fontstd = QFont("Consolas", 10)

2. Нет, это не сработало. Также не было определения «Courier New» в качестве шрифта, и я проверил, что оба они есть в системе и могут быть использованы. Но это дало мне идею для дальнейшего тестирования с неожиданным результатом; слишком сложно для комментариев, я сделаю сообщение.

Ответ №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() .

Удаление строки с моноширинным пространством:

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

и я получаю шрифт фиксированной ширины, который, по словам PyQt5, является консольным! Снова использую пустой QFont() , и я возвращаюсь к пропорциональному шрифту, а PyQt5 притворяется новым Courier.

Использование пропорционального шрифта, такого как ‘Times’:

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

таким образом, вторая строка противоречит первой, используется несколько раз (или подобных раз), но PyQt5 по-прежнему делает вид, что показывает Courier New!

Используя только строку:

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

действительно используется шрифт фиксированной ширины, и PyQt5 говорит, что это Consolas.

Итак, где-то есть ошибка; я предполагаю, что это в PyQt5?

В качестве обходного пути мне теперь нужно различать Windows и Linux (и Mac?), Чего, как я надеялся, можно избежать с помощью Qt.