PyInstaller不会将PyQt的图像加载到GUI

Lea*_*let 11 python pyinstaller pyqt4 python-2.7

我一直有一些复杂性将我的脚本传递给可执行文件,但我终于成功了.主要问题是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'))
Run Code Online (Sandbox Code Playgroud)

它假设抓住那些图像,就像它在这里说的那样:

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
Run Code Online (Sandbox Code Playgroud)

它们在文件夹中,但它们不会因某种原因而起作用.

整个源代码(减去PyInstaller文件)就在这里.

我感谢您的帮助.

Lea*_*let 10

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

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

    python Makespec.py --noconsole --icon="youricon.ico" --name="App name" program.py
    
    Run Code Online (Sandbox Code Playgroud)
  • 打开.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'))
    
    Run Code Online (Sandbox Code Playgroud)

    a.binaries之前,你应该添加这段代码:

           Tree('C:\\Your\\App\\Path\\To\\Images'),
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    <RCC>
      <qresource prefix="/" >
        <file>img/image1.png</file>
        <file>img/image2.png</file>
        <file>img/image3.png</file>
      </qresource>
    </RCC>
    
    Run Code Online (Sandbox Code Playgroud)

    显然,你的图像.这需要使用以下命令编译为.py格式:

    pyrcc4 -o images.qrc images_qr.py
    
    Run Code Online (Sandbox Code Playgroud)
  • 最后,我们需要将它添加到我们的脚本中,例如:

    import images_qr
    
    ...
    
    self.setWindowIcon(QtGui.QIcon(':/img/image1.png')) # The colon must be there
    
    Run Code Online (Sandbox Code Playgroud)

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

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