某些图标文件不显示在冻结的 PyQt5 应用程序中

Certain icon files do not display in a frozen PyQt5 application

我一直在开发一个我们希望广泛共享的 PyQt5 GUI 应用程序,因此我一直在尝试使用 py2exe 打包所有内容。所有程序功能似乎在包形式中都运行良好,唯一的例外是未显示某些自定义 SVG 图标。

在寻找我的问题的答案时,由于 this answer,我发现了 PyQt 的图像格式插件。然而,在我的发行版中包含图像格式并没有缓解这个问题。

以下是我的设置文件中的相关内容:

import sys
import os
from setuptools import setup
import py2exe

VERSION = '1.0.0'

includes = [
    "PyQt5",
    "PyQt5.QtCore",
    "PyQt5.QtGui",
    "PyQt5.sip",
]

PYTHON_DIRECTORY = sys.exec_prefix
PYQT_PATH = os.path.join(
    PYTHON_DIRECTORY,
    'Lib',
    'site-packages',
    'PyQt5',
    'Qt5'
)

datafiles = [
    ("platforms", [os.path.join(PYQT_PATH, 'plugins', 'platforms', 'qwindows.dll')]),
    ("imageformats", [os.path.join(PYQT_PATH, 'plugins', 'imageformats', format) for format in os.listdir(os.path.join(PYQT_PATH, 'plugins', 'imageformats'))]),
    (
        "", [
            r"c:\windows\syswow64\MSVCP100.dll",
            r"c:\windows\syswow64\MSVCR100.dll",
            os.path.join(PYQT_PATH, 'bin', 'Qt5Widgets.dll'),
            os.path.join(PYQT_PATH, 'bin', 'Qt5Core.dll'),
            os.path.join(PYQT_PATH, 'bin', 'Qt5Gui.dll'),
        ]
    )
]

setup(
    name='application',
    version=VERSION,
    packages=['model', 'view'],
    url='',
    license='',
    windows=[{"script": "main.py"}],
    scripts=['main.py'],
    data_files=datafiles,
    install_requires=[],
    options={
        "py2exe":{
            "includes": includes,
        }
    }
)

PyQt5 中的 SVG 图标需要Qt5Svg.dll以及图像格式插件才能显示。将以下内容添加到 setup.py 应该可以解决问题:

datafiles = [
    ...
    (
        "", [
            ...
            os.path.join(PYQT_PATH, 'bin', 'Qt5Svg.dll'),
        ]
    )
]

进一步调试 py2exe 的有用提示:Sysinternals ProcMon 对于发现丢失的 DLL 非常有用。只需过滤您的应用程序名称并查找类似的“NAME NOT FOUND”条目: