Search code examples
pythonpyqtpyqt5pyinstallerqt-designer

retain the font in every system


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:

enter image description here

different machine:

enter image description here

how do i retain the fonts in all system?


Solution

  • 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:

    • Use --add-data:
    ├── 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 ;.

    • Use qresource:
    ├── 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()