PyInstaller无法将PyQt的图像加载到GUI中。

12

我一直有些麻烦将我的脚本转换为可执行文件,但最终我成功了。主要问题是PyInstaller不能将图像加载到GUI中。

这是应该看起来的样子:

How it should look like

这是实际看起来的样子:

How it looks like

我似乎找不到问题所在,这是.spec文件的内容:

a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'programa.py'],
             pathex=['img', 'C:\\Users\\Poblet\\ManGet\\HeyMang\\pyinstaller'])
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name=os.path.join('build\\pyi.win32\\Hey Mang!', 'Hey Mang!.exe'),
          debug=False,
          icon='heymang.ico',
          strip=False,
          upx=True,
          console=False )
coll = COLLECT( exe,
               Tree('C:\\Users\\Poblet\\ManGet\\HeyMang\\pyinstaller\\img'),
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name=os.path.join('dist', 'Hey Mang!'))
app = BUNDLE(coll,
             name=os.path.join('dist', 'Hey Mang!.app'))

它应该抓取那些图像,就像这里所说的一样:

Warnings written to C:\Users\Poblet\ManGet\HeyMang\pyinstaller\Hey Mang!\warnHey Mang!.txt
checking PYZ
rebuilding outPYZ1.toc because outPYZ1.pyz is missing
building PYZ outPYZ1.toc
checking PKG
rebuilding outPKG3.toc because outPKG3.pkg is missing
building PKG outPKG3.pkg
checking EXE
rebuilding outEXE2.toc because Hey Mang!.exe missing
building EXE from outEXE2.toc
I: SRCPATH [('heymang.ico', None)]
I: Updating icons from ['heymang.ico'] to c:\users\poblet\appdata\local\temp\tmpr34zmp
I: Writing RT_GROUP_ICON 0 resource with 76 bytes
I: Writing RT_ICON 1 resource with 1128 bytes
I: Writing RT_ICON 2 resource with 4264 bytes
I: Writing RT_ICON 3 resource with 9640 bytes
I: Writing RT_ICON 4 resource with 16936 bytes
I: Writing RT_ICON 5 resource with 67624 bytes

它们在文件夹中,但由于某个原因无法正常工作。

整个源代码(不包括PyInstaller文件)在这里

感谢您的帮助。


这不是直接解决您的问题,但您可以尝试使用Qt资源系统pyrcc4将它们转换为.py文件。在使用PyInstaller编译的资源文件中,我在PyQt脚本中没有遇到过问题。 - Avaris
4个回答

19

我已经解决了这个问题,这对其他人也有帮助:

  • 使用以下命令创建.spec文件:

python Makespec.py --noconsole --icon="youricon.ico" --name="App name" program.py
打开 .spec 文件(例如:应用名称/应用名称.spec),你应该会看到类似这样的内容:
a = Analysis([
        os.path.join(HOMEPATH,'support\\_mountzlib.py'),
        os.path.join(HOMEPATH,'support\\useUnicode.py'),
        'program.py'
    ], pathex=[
        'C:\\Your\\User\\Path\\To\\pyinstaller'
])
pyz = PYZ(a.pure)
exe = EXE(
        pyz,
        a.scripts,
        exclude_binaries=1,
        name=os.path.join('build\\pyi.win32\\App Name', 'App Name.exe'),
        debug=False,
        strip=False,
        upx=True,
        console=False , icon='youricon.ico'
)
coll = COLLECT(
        exe,
        a.binaries,
        a.zipfiles,
        a.datas,
        strip=False,
        upx=True,
        name=os.path.join('dist', 'Hey Mang!')
)
app = BUNDLE(coll, name=os.path.join('dist', 'Hey Mang!.app'))

a.binaries之前,您应该添加以下代码:

       Tree('C:\\Your\\App\\Path\\To\\Images'),

因此,当PyInstaller读取.spec文件时,编译器将把图像传递到dist目录。

  • 现在我们需要创建.qrc文件,它将加载我们的图像。这个文件应该长这样:

  • <RCC>
      <qresource prefix="/" >
        <file>img/image1.png</file>
        <file>img/image2.png</file>
        <file>img/image3.png</file>
      </qresource>
    </RCC>
    

    显然,使用您的图像。并且需要使用以下命令编译为.py格式:

    pyrcc4 -o images.qrc images_qr.py
    
  • 最后,我们需要将此内容添加到我们的脚本中,例如像这样:

  • import images_qr
    
    ...
    
    self.setWindowIcon(QtGui.QIcon(':/img/image1.png')) # The colon must be there
    

    编译后,您应该可以正常看到图像,就像这样:

    我希望这能对所有遇到同样问题的人有所帮助。请记得给出正确的图像路径并在图像后添加冒号。


    谢谢Leandro!我花了很长时间才让我的图标工作起来... Pyinstaller对我来说是新的,如果你没有写这个解释,我想我会在这里熬夜。祝一切顺利。 - Kim
    哇,这可能是我一直以来遇到的问题。谢谢! 不过...话说回来,使用Python和Qt的组合似乎会在构建过程中增加一些额外的步骤。我倾向于使用wxWidgets,它似乎更简单,并且据我所知不需要编译资源。 - fatuhoku
    顺便提一下,看看我上面的帖子。规范文件中的Tree命令对此并不必要。只需创建资源文件即可。 - jramm
    你或许能够帮助解决我的问题 - ballade4op52
    我知道这是一个四年前的问题,但如果有人能回答一下。这种方法适用于将任何图像导入到dist目录还是只适用于图标。因为我正在使用pygame和pyinstaller,但似乎无法使图像进入正确的目录。 - abc1234
    Makespec.py是什么? - Jaime02

    3

    以下是方法的快速更新。首先,这是一种在PyQt/Pyside应用程序中轻松包含图像的好方法。对于Pyside,只需使用pyside-rcc.exe而不是pyrcc4。

    其次,我并不确定Tree(...)命令是否必要。使用此方法创建一个dist文件夹后,我删除了所有通过Tree..命令复制进来的图像文件。我的可执行文件仍然可以正常工作,并且图像正确显示。因此,我们可能只需要创建qrc文件并运行pyrcc程序,确保Python模块已更新为带有冒号前缀的图像文件路径。


    刚刚尝试在规范文件中不使用“Tree”命令进行构建,结果正常。 - jramm

    2
    如果您正在使用Qt Designer,您可以很容易地添加图标和图片。 请参考这里的教程:http://doc.qt.io/qt-4.8/designer-resources.html 在PySide 1.2.2上测试通过,使用了Qt Designer 4.8.5和Pyinstaller 2.1。

    你或许能够帮助解决我的问题 - ballade4op52

    0
    将exe文件移动到图像文件夹所在的文件夹中,或者与main.py文件位于同一文件夹中。 点击这里">查看详情

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接