12

我在将脚本传递给可执行文件时遇到了一些复杂的问题,但我终于设法做到了。主要问题是 PyInstaller 不会将图像加载到 GUI。

它应该是这样的:

它应该是什么样子

这是它的样子:

它看起来如何

而且我似乎找不到问题,这是 .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 文件)在这里

我感谢您的帮助。

4

4 回答 4

17

我能够解决这个问题,这也应该对其他人有所帮助:

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

    python Makespec.py --noconsole --icon="youricon.ico" --name="App name" program.py
    
  • 打开 .spec 文件(例如:App name/App name.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
    

一旦你编译你应该看到图像就好了,像这样:

我希望这可以帮助每个有同样问题的人。请记住提供正确的图像路径并将冒号添加到图像中。

于 2012-07-18T17:36:40.550 回答
3

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

其次,我不相信该Tree(...)命令甚至是必要的。使用此方法创建 dist 文件夹后,我删除了使用Tree..命令复制的所有图像文件。我的可执行文件仍然有效,并且图像显示正确。所以可能我们只需要创建 qrc 文件并运行 pyrcc 程序,确保 python 模块使用冒号前缀更新为 iamge 文件路径。

于 2014-04-29T15:44:36.160 回答
2

如果您使用的是 Qt Designer,则可以轻松添加图标和图像。按照这里的教程http://doc.qt.io/qt-4.8/designer-resources.html

使用 Qt Designer 4.8.5 和 Pyinstaller 2.1 在 PySide 1.2.2 上测试

于 2015-08-08T17:46:23.870 回答
0

将 exe 文件移动到 image 文件夹所在的文件夹或 main.py 所在的同一文件夹中。

看到这个

于 2020-01-27T07:39:48.253 回答