Загрузка...

[CustomTkinter + Pyinstaller] How to do a normal font import?

Thread in Python created by NEVERTHELESS May 15, 2023. 328 views

  1. NEVERTHELESS
    Каким образом можно импортировать шрифты в программу так, чтобы можно было собрать проект в pyinstaller, как один файл?
    В CTk шрифты импортируются следующим образом:
    Python
    NameFont = customtkinter.CTkFont(family="MicrogrammaDBolExt", size=18)
    Для того, чтобы программ их распознавала, в начале прописываю следующий код:
    Python
    load_font(fetch_resource("C:/NeverSeller2/fonts/microgrammad_boldexte.ttf"))
    Где функция работает следующим образом:
    Python
    def fetch_resource(relative_path):
    try:
    base_path = getattr(sys, '_MEIPASS', os.getcwd())
    except Exception:
    base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)


    def load_font(font_path, private=True, enumerable=False):
    FR_PRIVATE = 0x10
    FR_NOT_ENUM = 0x20
    flags = (FR_PRIVATE * int(private)) | (FR_NOT_ENUM * int(1 - enumerable))
    font_fetch = str(fetch_resource(font_path))
    path_buf = ctypes.create_unicode_buffer(font_fetch)
    add_font = ctypes.windll.gdi32.AddFontResourceExW
    font_added = add_font(ctypes.byref(path_buf), flags, 0)
    return bool(font_added)
    Если коротко, то позволяю программе распознавать их. При попытке собрать всё это дело Pyinstaller'ом сталкиваюсь с тем, что он не включает шрифты в экзешник, а напрямую берёт их из папки fonts. Если её переименовать или убрать, то, логично, шрифт в программе становится стандартным. Проект собираю со следующими настройками .spec файла:

    Python
    # -*- mode: python ; coding: utf-8 -*-

    block_cipher = None


    a = Analysis(
    ['main.py'],
    pathex=['c:\\neverseller2\\fonts'],
    binaries=[],
    datas=[('c:/neverseller2/customtkinter-5.1.3.dist-info/', 'c:/neverseller2/customtkinter-5.1.3.dist-info/'), ('c:/neverseller2/customtkinter/', 'c:/neverseller2/customtkinter/')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
    )

    a.datas += [('CascadiaCode.ttf','C:\\NeverSeller2\\fonts\\CascadiaCode.ttf', "DATA")]
    a.datas += [('CascadiaMono.ttf','C:\\NeverSeller2\\fonts\\CascadiaMono.ttf', "DATA")]
    a.datas += [('microgrammad_boldexte.ttf','C:\\NeverSeller2\\fonts\\microgrammad_boldexte.ttf', "DATA")]

    pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

    exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='NeverSeller v1.4.0 (e12102020)',
    debug=True,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    )
    Возможно есть люди, которые сталкивались с чем-то подобным? Может у кого-то есть свой уникальный адекватный способ добавления шрифтов и их импорта в exe-файл?
     
    1. loverkiss
    2. NEVERTHELESS Topic starter
      avatarloverkiss,
  2. NEVERTHELESS
    NEVERTHELESS Topic starter May 15, 2023 Автобай => https://zelenka.guru/threads/6245097/ 1,050 Jun 30, 2022
Loading...