Можно ли вшить шрифт в программу PyQt5

Я использую кастомный шрифт в кнопках. Конвертирую py в exe через pyinstaller и кидаю другу, но проблема в том, что у друга шрифт не установлен, а следовательно и на кнопках шрифт поменялся на стандартный.

Можно ли как-нибудь вшить шрифт, чтобы человеку не пришлось его устанавливать?


Ответы (2 шт):

Автор решения: Alexander Chernin

В первую очередь надо добавить файл со шрифтами в ресурсы приложения, то есть в файл *.res.

Пусть имя файла шрифта будет somefont.ttf, тогда в коде (лучше в самом начале приложения, сразу после создания переменной приложения):

...
from PyQt5.QtGui import QFontDatabase
...

app = QApplication([])
id = QFontDatabase.addApplicationFont(':<Путь/к/файлу/шрифта/somefont.ttf>')
# Если id равен -1, то шрифт не установлен
if id == -1:
    print('Шрифт somefont не установлен')

Теперь в любом месте программы можно обратиться к данному шрифту по имени (без расширения файла):

...
font = QFont('somefont')
somelabel.setFont(font)
...

p.s. После внесения изменений, файл ресурсов должен быть вновь откомпилирован

p.p.s Файл ресурсов имеет формат xml и расширение .res. Разместить его можно рядом с файлом main.py вашего приложения.

Если в нем будет только шрифт, то выглядеть он будет так

<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
    <file><path/to/>somefont.ttf</file>
</qresource>
</RCC>
→ Ссылка
Автор решения: S. Nick
  1. Создайте файл ресурсов например

font_resources.qrc

<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix='/'>
  <file>Fonts/fontawesome-webfont.ttf</file>
</qresource>
</RCC>

у меня в папке Fonts находится fontawesome-webfont.ttf

  1. Выполните

    pyrcc5 font_resources.qrc -o font_resources_rc.py

  2. в своем main.py

    • добавьте import font_resources_rc

    • пропишите путь к шрифтам так ":/Fonts/fontawesome-webfont.ttf"

  3. Проверьте работу python main.py

  4. pyinstaller -F -w main.py

addApplicationFont_qrc.py

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QToolButton, QMessageBox 
from PyQt5.QtGui     import QFontDatabase, QFont
from PyQt5.QtCore    import Qt

import font_resources_rc                                                        # +++ !!!

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        fontId = QFontDatabase.addApplicationFont(":/Fonts/fontawesome-webfont.ttf")
        QMessageBox.information(None, "Message", f"fontId -> {fontId}")

        if fontId == 0:
            fontName = QFontDatabase.applicationFontFamilies(fontId)[0]
            self.font = QFont(fontName, 30)
        else:
            self.font = QFont()

        btn = QToolButton(self)
        btn.setToolButtonStyle(Qt.ToolButtonIconOnly)
        btn.setFont(self.font)                                                    # !
        btn.setText(chr(0xf101))
        self.setCentralWidget(btn)
        btn.clicked.connect(self.close)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWnd = MyWindow()
    mainWnd.show()
    sys.exit(app.exec_())

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

→ Ссылка