Pyinstaller和--onefile:如何在exe fi中包含图像

2024-03-28 13:01:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用Pyinstaller创建了一个exe文件。

pyinstaller.exe --onefile --icon='Loco.ico program.py

在程序中,我在绘图中包含一个图像,当我在其文件夹中单独运行程序时,会得到以下结果:

IOError: [Errno 2] No such file or directory: 'Logo.png'

一种解决方案是将图像包含在exe的文件夹中,如下面的链接所示:

pyinstaller does not show images and icon

但是再一次强调,一个文件的全部意义就是要有一个完全正确的文件,而不需要另外的图像。我想解决办法可能就在这个环节,但我还不明白。

Bundling data files with PyInstaller (--onefile)

我的规范文件如下所示:

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
    pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
    hiddenimports=[],
    hookspath=None,
    runtime_hooks=None)

pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True , icon='AMOS.ico')

Tags: 文件py图像程序文件夹nonetrueexe
3条回答

在“hiddenimports=[]之前添加“datas=['Location of your file']”。那就行了。 在我的情况下,这是有效的

    # -*- mode: python -*-

block_cipher = None


a = Analysis(['embed.py'],
             pathex=['C:\\Users\\Aravind\\Desktop\\exe'],
             binaries=[],
             datas=['C:\\Users\\Aravind\\Desktop\\exe\\dist\\map.png'],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='embed',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )

如果您使用的是Qt设计器,则可以通过创建资源文件并将所需的所有图像(包括Logo.png)添加到此资源来完成此操作。

要创建资源文件,可以按照Inserting an image in GUI using QT Designer中的步骤操作。

在资源文件中插入图像后,将Logo.png分配给窗口图标,保存QtDesigner界面,并使用命令转换资源文件:pyrcc4 -py3 resourcetest.qrc -o resourcetest_rc.py

最后,使用--onefile选项创建exe文件。无需编辑等级库文件。

编辑:

我相信我找到了解决问题的办法。

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
         pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
         hiddenimports=[],
         hookspath=None,
         runtime_hooks=None)

for d in a.datas:
    if 'pyconfig' in d[0]:
        a.datas.remove(d)
        break

a.datas += [('Logo.png','C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\Logo.png', 'Data')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True, icon='C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\AMOS.ico')

并在main.py脚本中添加以下内容

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

Logo = resource_path("Logo.png")

相关问题 更多 >