如何将TrueType字体文件添加到pyinstaller可执行文件以与Pygame一起使用?

时间:2020-08-25 19:11:34

标签: python pyinstaller

我创建了一个名为breakout.py的python文件,并希望使用pyinstaller创建一个exe。 python文件需要与python脚本位于同一目录中的文件ARCADECLASSIC.TTF才能运行。我也希望能够运行exe文件而不必拥有字体文件。我尝试了多个pyinstaller命令来尝试执行此操作。

我尝试了此命令pyinstaller --add-binary "ARCADECLASSIC.TTF;." --onefile breakout.py,并收到了一个权限被拒绝的错误号13。

然后,我尝试编辑代码,以使字体文件位于名为fonts的目录中,并尝试运行此命令pyinstaller --add-binary "fonts/ARCADECLASSIC.TTF;fonts" --onefile breakout.py,该命令没有错误,但是当我运行exe文件时出现错误,提示没有文件这样的命名字体/ARCADECLASSIC.TTF崩溃了。

我现在也尝试指定字体文件的完整目录,但仍然无法使用。

如果这有助于我的操作系统是Windows,并且在pyinstaller 4.0中使用的是python 3.8.5 64位,则为

首先是我正在尝试做的事情,其次是如果可能的话我该怎么做以及我在做什么错。

1 个答案:

答案 0 :(得分:1)

您将需要创建一个.spec文件,并提及要包含在其中的内容,例如字体或其他图像。

# -*- mode: python -*-

block_cipher = None


a = Analysis(['your python file.py'],
             pathex=['C:\\path\\to\\directory'], # just the directory not the file
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

a.datas += [('ttf file','path\\to\\ttf\\file', "DATA")]

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

exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='Your App Name',
      debug=False,
      strip=False,
      upx=True,
      console=False # set True if command prompt window needed
)

包含游戏的实际python文件中。

def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

每当您要加载字体时,都要这样做。

font = pygame.font.Font(resource_path("Font.ttf"), size)

在主python文件中保存完该文件后,在终端中输入您创建的spec文件。

pyinstaller yourspecfile.spec

这将创建您的可执行文件,并且它应该可以独立工作。

这是我上一个项目中的规格文件的外观 #--模式:python--

block_cipher = None


a = Analysis(['lol.py'],
         pathex=['C:\\games\\snake'],
         binaries=[],
         datas=[],
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)

a.datas += [('8min.ttf','C:\\games\\snake\\8min.ttf', "DATA")]

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

exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='Snake',
      debug=False,
      strip=False,
      upx=True,
      console=False)