Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt/PySide-图标显示_Python_Pyqt_Pyqt4_Py2exe_Pyside - Fatal编程技术网

Python PyQt/PySide-图标显示

Python PyQt/PySide-图标显示,python,pyqt,pyqt4,py2exe,pyside,Python,Pyqt,Pyqt4,Py2exe,Pyside,我有一个PySide应用程序,它有一个用于主窗口的图标(一个QMainWindow实例)。当我正常运行文件时,图标是可见的,一切正常,但当我使用py2exe创建一个exe时,图标不会出现。这在cx\u freeze中也会发生(因此我认为问题不在于py2exe) 该应用程序是使用QtDesigner设计的,并使用pyside uic转换为python。我尝试将图标用作文件和资源(qrc文件),但两者似乎都不起作用 任何帮助或指点都将不胜感激 谢谢。我假设它与bmp一起工作,而不是png/jpg?如

我有一个PySide应用程序,它有一个用于
主窗口的图标(一个
QMainWindow
实例)。当我正常运行文件时,图标是可见的,一切正常,但当我使用
py2exe
创建一个exe时,图标不会出现。这在
cx\u freeze
中也会发生(因此我认为问题不在于
py2exe

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

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


谢谢。

我假设它与bmp一起工作,而不是png/jpg?如果是这样的话,很可能是图像格式插件加载不正确


我猜在已安装应用程序的目录中设置一个文件,并确保插件dll转到/plugins/imageformats/将使事情更好地工作。

这可能与Windows 7的任务栏图标处理有关吗


请参阅以获得答案。

我也有同样的问题。经过调查,我找到了一个解决方案: (麦克的想法是对的)

cx\u freeze
不复制
PyQt
plugins目录,该目录包含
ico
图像读取器。 以下是步骤:

  • setup.py
    中,将
    PyQt4
    插件目录复制到您的发行版
  • 在代码中编写如下内容:

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

    我仍然想捆绑其他所有东西,所以我排除了qt DLL并手动添加它们。My 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映像以外的内容,还需要添加正确的插件。

    您必须在发布文件夹中手动包含“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
                      ...},
          ...)
    

    实际上,它是一个.ico文件。我无法让图标正常工作,决定将应用程序切换到wxpython,这里有一个将图像转换为python文件的工具。有了它,我在最终的可执行文件中没有任何问题。因为我使用wxformbuilder来构建UI,所以转换应用程序也不需要太长时间。谢谢。@user547057:啊。这是一个py2exe/cz_冻结问题,而不是一个Qt问题。嗨,谢谢你的回答。这是可行的,但我必须用“\\”而不是/”将图像或图标路径更改为其绝对路径。尽管pyinstaller不需要任何安装文件,但它仍然可以工作。我喜欢将图标放入.qrc资源文件中,并将其编译为python代码,以避免类似的路径问题。您也不必担心确保图标和图像包含在构建脚本中。所以你可能想再次尝试使用它们。@Gerald-你有什么特别的理由把shiboken包括在这个答案中吗?据我所知,如果没有它,一切正常。@ArtOfWarfare早就出现了,当时这是使它工作所需的最小.dll(通过反复试验确定)。完全有可能2年后不再需要shiboken了。我做了一个要点,展示了在PyQt中使用它。我迟早会和皮赛德一起做的。更好的是,只需将
    imageformats
    文件夹复制到二进制文件所在的位置。
    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
                      ...},
          ...)