Можно ли вшить шрифт в программу PyQt5
Я использую кастомный шрифт в кнопках. Конвертирую py в exe через pyinstaller и кидаю другу, но проблема в том, что у друга шрифт не установлен, а следовательно и на кнопках шрифт поменялся на стандартный.
Можно ли как-нибудь вшить шрифт, чтобы человеку не пришлось его устанавливать?
Ответы (2 шт):
В первую очередь надо добавить файл со шрифтами в ресурсы приложения, то есть в файл *.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>
- Создайте файл ресурсов например
font_resources.qrc
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix='/'>
<file>Fonts/fontawesome-webfont.ttf</file>
</qresource>
</RCC>
у меня в папке Fonts находится fontawesome-webfont.ttf
Выполните
pyrcc5 font_resources.qrc -o font_resources_rc.pyв своем
main.pyдобавьте
import font_resources_rcпропишите путь к шрифтам так
":/Fonts/fontawesome-webfont.ttf"
Проверьте работу
python main.pypyinstaller -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_())
