In pyqt5 application, i have applied a font for the label using css in qtdesigner
font: 57 68px "IntelOne Display Medium";
border: None;
I build exe using pyinstaller and run in my windows machine it works fine, but when i run the same exe in different machine, the font is different, its not bold
my machine:
different machine:
how do i retain the fonts in all system?
You have to make sure the fonts are available, so the solution is to load it using QFontDatabase.
For this to be available there are 2 options:
├── fonts
└── main.py
import os
import sys
from pathlib import Path
from PyQt5.QtCore import QDir
from PyQt5.QtGui import QFontDatabase
from PyQt5.QtWidgets import QApplication
DIR_APPLICATION = (
Path(sys.executable).parent
if getattr(sys, "frozen", False)
else Path(__file__).resolve().parent
)
def load_fonts_from_dir(directory):
families = set()
for fi in QDir(directory).entryInfoList(["*.ttf", "*.woff", "*.woff2"]):
_id = QFontDatabase.addApplicationFont(fi.absoluteFilePath())
families |= set(QFontDatabase.applicationFontFamilies(_id))
return families
def main():
app = QApplication(sys.argv)
# LOAD FONTS
font_dir = DIR_APPLICATION / "fonts"
families = load_fonts_from_dir(os.fspath(font_dir))
print(families)
# FIXME
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Command:
pyinstaller --add-data "fonts/*:fonts" --onefile main.py
Note: In windows change :
to ;
.
├── fonts
├── main.py
├── resource.qrc
└── resource_rc.py
resource.qrc
<RCC>
<qresource prefix="/">
<file>fonts/foo.ttf</file>
<file>fonts/bar.ttf</file>
<file>fonts/baz.ttf</file>
</qresource>
</RCC>
pyrcc5 resource.qrc -o resource_rc.py
import os
import sys
from PyQt5.QtCore import QDir
from PyQt5.QtGui import QFontDatabase
from PyQt5.QtWidgets import QApplication
import resource_rc
def load_fonts_from_dir(directory):
families = set()
for fi in QDir(directory).entryInfoList(["*.ttf", "*.woff", "*.woff2"]):
_id = QFontDatabase.addApplicationFont(fi.absoluteFilePath())
families |= set(QFontDatabase.applicationFontFamilies(_id))
return families
def main():
app = QApplication(sys.argv)
# LOAD FONTS
font_dir = ":/fonts"
families = load_fonts_from_dir(os.fspath(font_dir))
print(families)
# FIXME
sys.exit(app.exec_())
if __name__ == "__main__":
main()