#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.