【问题标题】:PyQt/PySide - icon displayPyQt/PySide - 图标显示
【发布时间】:2011-06-02 05:16:22
【问题描述】:

我有一个 PySide 应用程序,它有一个 MainWindowQMainWindow 实例)的图标。当我正常运行文件时,图标是可见的,一切都很好,但是当我使用py2exe 创建一个 exe 时,图标没有出现。 cx_freeze 也会发生这种情况(所以我认为问题不在于 py2exe)。

该应用程序是使用QtDesigner 设计的,并使用pyside-uic 转换为python。我尝试将图标用作文件和资源(qrc 文件),但似乎都不起作用。

任何帮助或指点将不胜感激。

谢谢。

【问题讨论】:

    标签: python pyqt pyqt4 py2exe pyside


    【解决方案1】:

    只要您不尝试将 Qt dll 捆绑到 library.zip 或 exe 中,kochelmonster 的解决方案就可以工作。如果您将插件放在应用程序目录的基础中,您也不需要设置库路径。

    我仍然想捆绑其他所有东西,所以我排除了 qt dll 并手动添加它们。我的 setup.py 看起来像这样:

    from os.path import join
    
    _PYSIDEDIR = r'C:\Python27\Lib\site-packages\PySide'
    data_files =[('imageformats',[join(_PYSIDEDIR,'plugins\imageformats\qico4.dll')]),
                  ('.',[join(_PYSIDEDIR,'shiboken-python2.7.dll'),
                    join(_PYSIDEDIR,'QtCore4.dll'),
                    join(_PYSIDEDIR,'QtGui4.dll')])
                  ]
    setup(
        data_files=data_files,
        options={
            "py2exe":{
                "dll_excludes":['shiboken-python2.7.dll','QtCore4.dll','QtGui4.dll'],
                "bundle_files": 2
                ...
            }
        }
        ...
    )
    

    如果您的项目使用额外的 Qt dll,您也必须排除并手动添加它们。如果您需要加载 .ico 图像以外的其他内容,您还需要添加正确的插件。

    【讨论】:

    • 您好,感谢您的回答。这行得通,但我必须使用 '\\'es 而不是 / 将图像或图标路径更改为其绝对路径。即使不需要安装文件,这也适用于 pyinstaller。
    • 我喜欢将图标放入 .qrc 资源文件中,然后将它们编译为 python 代码以避免类似的路径问题。您也不必担心确保图标和图像包含在构建脚本中。所以你可能想再次尝试使用它们。
    • @Gerald - 您在这个答案中包含 shiboken 有什么特别的原因吗?据我所知,没有它就可以了。
    • @ArtOfWarfare 早在这是使其工作所需的最小 .dll 时(通过反复试验确定)。完全有可能2年后不再需要shiboken。
    • 我做了一个要点,展示了在 PyQt 中使用它。我迟早会用 PySide 做一个。 gist.github.com/peteristhegreat/0a05d7029befc5c2a302
    【解决方案2】:

    我假设它适用于 bmp,但不适用于 png/jpg?如果是这样,则图像格式插件可能无法正确加载。

    我猜想在已安装应用程序的目录中设置一个 qt.conf 文件并确保 plugin-dll 转到 /plugins/imageformats/ 会更好地工作。

    【讨论】:

    • 嗯,它实际上是一个 .ico 文件。我无法让图标正常工作,并决定将应用程序切换到 wxpython,其中存在将图像转换为 python 文件的工具。有了它,我在最终的可执行文件中没有任何问题。由于我使用 wxformbuilder 构建 UI,因此转换应用程序也没有花费太长时间。谢谢。
    • @user547057:啊。这更像是一个 py2exe/cz_freeze 问题,而不是 Qt 问题。
    【解决方案3】:

    我遇到了同样的问题。经过一番调查,我找到了解决方案: (Macke 的想法是对的)

    cx_freeze 不会复制包含ico 图像阅读器的PyQt 插件目录。 步骤如下:

    1. setup.py 中将PyQt4 插件目录复制到您的发行版中
    2. 在您的代码中编写如下内容:
    application_path = os.path.split(os.path.abspath(sys.argv[0]))[0]
    try:
       if sys.frozen:
            plugin_path = os.path.join(application_path, "qtplugins")
            app.addLibraryPath(plugin_path)
    except AttributeError:
        pass
    

    【讨论】:

    • 更好的是,只需将imageformats 文件夹复制到您的二进制文件所在的位置。
    【解决方案4】:

    会不会和 Windows 7 的任务栏图标处理有关?

    请参阅How to set application's taskbar icon in Windows 7 以获得答案。

    【讨论】:

      【解决方案5】:

      您必须在发布文件夹中手动包含“qico4.dll”。在你的 setup.py 中插入这个:

      import sys
      from os.path import join, dirname
      from cx_Freeze import setup, Executable
      
      _ICO_DLL = join(dirname(sys.executable), 
                           'Lib', 'site-packages',
                           'PySide', 'plugins',
                           'imageformats', 'qico4.dll')
      
      build_exe = {
              'include_files': [(
                      _ICO_DLL,
                      join('imageformats', 'qico4.dll'))]}
      
      setup(name = "xxxxx",
            version = "1.0.0",
            ...
            options = { ...
                       'build_exe': build_exe
                        ...},
            ...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 2014-08-08
        • 2017-04-08
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多