【问题标题】:Images not showing when running a frozen pyqt app on another computer在另一台计算机上运行冻结的 pyqt 应用程序时不显示图像
【发布时间】:2011-08-08 23:32:48
【问题描述】:

我有一个使用 cx_freeze 冻结的 PyQt4 程序。我遇到的问题是,当我制作一个 QGraphicsPixmapItem 时,它正在获取由 SVG 文件制作的像素图,该项目没有问题,但像素图没有加载,因此场景中没有图像只有项目.让我感到困惑的是,这只发生在我在与构建 exe 的计算机不同的计算机上运行它时。当我在构建它的计算机上运行 exe 时,程序运行良好。即使我尝试在计算机上安装了所有必需的 python 组件和 pyqt 组件的计算机上运行它,如果不是构建它的计算机,像素图也不会从 svg 文件加载。我不确定这是否是我的 cx_freeze setup.py 文件的问题,或者我是否需要更改主代码中的某些内容,以便任何帮助或只是为我指明正确的方向。我的感觉是,当 cx_freeze 正在构建它时,有些东西变得一团糟,所以我将在下面粘贴我的 setup.py 文件的内容。我也在使用 Python v3.1 在 Windows 上运行。

from cx_Freeze import setup, Executable

files = ['drawings\\FULL', 'drawings\\PANEL', 'data.csv', 'panelData.csv']
binIncludes = ['C:\\Python31\\Lib\\site-packages\\PyQt4\\bin\\QtSvg4.dll']
includes = ['main', 'PunchDialog', 'ArrayDialog', 'PricingDialog', 'FontAndInputDialog', 'PanelSelector', 'PyQt4', 'os', 'sys', 'ctypes', 'csv']
packages = ['drawings']
path = ['C:\\Users\\Brock\\Documents\\Programming\\PanelDesigner\\DrawingFirst', 'C:\\Python31\\Lib', 'C:\\Python31\\Lib\\site-packages', 'C:\\Python31\\DLLs']

setup(
        name = 'PanelBuilder',
        version = '1.0',
        description = 'Allows user to draw custom panel layouts.',
        author = 'Brock Seabaugh',
        options = {'build_exe': {'packages':packages, 'path':path, 'include_files':files, 'bin_includes':binIncludes, 'includes':includes}},
        executables = [Executable('PanelBuilder.py')])

PS。这是我的文件层次结构(如果有帮助的话):

\DrawingFirst
    Main .py file
    All .py files for all custom dialogs used
    \drawings
        some modules used
        \FULL
            A bunch of SVG files used
        \PANEL
            More SVG files used

【问题讨论】:

    标签: python-3.x pyqt pyqt4 cx-freeze


    【解决方案1】:

    这是我过去遇到的一个讨厌的问题。 让我引用http://www.py2exe.org/index.cgi/Py2exeAndPyQt: (我知道你正在使用 cx_freeze 但我相信你可以调整你的脚本)

    PyQt4 和图像加载(JPG、GIF、 等)

    PyQt4 使用插件来读取这些图像 格式,所以你需要复制 文件夹 PyQt4\plugins\imageformats 到 应用程序目录\imageformats。就像在 以上情况,您可以使用 data_files 为了这。这不适用于 bundle_files 开启。

    如果插件无法访问,则 QPixmap.load/loadFromData 将返回 在那些中加载图像时为 False 格式。

    testapp.py:

    from PyQt4 import QtGui, QtSvg
    import sys
    
    app = QtGui.QApplication([])
    wnd = QtSvg.QSvgWidget()
    wnd.load("flower.svg")
    wnd.show()
    sys.exit(app.exec_())
    

    setup.py:

    from cx_Freeze import setup, Executable
    files = ['flower.svg']
    includes = ['sip', 'PyQt4.QtCore']
    setup(
            name = 'Example',
            version = '1.337',
            description = 'Allows user to see what I did there.',
            author = 'something',
            options = {'build_exe': {'include_files':files, 'includes':includes}},
            executables = [Executable('testapp.py')])
    

    我在一台 Windows 7 机器上创建了这个测试应用程序,并将它复制到一台 Windows XP 机器上。我不必复制任何 dll - 它就是这样工作的。

    【讨论】:

    • 好的,所以这似乎是我正在寻找的答案,但由于某种原因,它仍然给我同样的问题。我复制了 imageformats 文件夹并用我的应用程序将 qt.conf 文件更改为链接到 imageformats 文件夹的新位置,一切正常。只是为了确保我将 qt.conf 文件更改为链接到错误的文件夹,这导致了与问题相同的问题,所以这显然是解决这个问题的方法,除非我将应用程序移到新计算机上,但我仍然得到同样的问题,所以我在更改 comps 时仍然缺少 svg 文件的依赖项。
    • 我自己试试看能不能搞定。
    • 感谢您的帮助,还有一点需要注意。该程序仍然以某种方式依赖于 Python 文件夹中的某些内容。当我更改我的 Python 文件夹的名称时,它会导致同样的问题。所以很明显,我仍然链接回我的 Python 安装来读取 SVG 文件,但我不知道是什么原因导致它链接回那个文件夹。再次感谢您迄今为止的帮助。
    • 我用一个对我有用的例子更新了答案。您可以在您的设置上尝试一下,看看这是否也适合您。也许您可以编写一个小示例程序来复制您的问题?如果有什么不同,我使用了 cx_freeze 4.2.3。
    • 所以你刚刚使用了那个设置文件?您是否必须复制 qt.conf 文件或 imageformat 目录?
    【解决方案2】:

    每当PyQt4.QtGui 包含在原始代码中时,我都会向cx_freeze 添加一个挂钩,其中包括imageformats。将imageformats 放在正确的位置,即使是外部存储的图标也能正常工作。

    https://bitbucket.org/anthony_tuininga/cx_freeze/pull-request/11/added-pyqt4qtgui-load-hook-that-adds/diff

    【讨论】:

    • 在合并之前(或类似的东西)我在 setup.py 中做了这个丑陋的 hack:pastebin.ca/2303611 也许它可以帮助其他人。
    【解决方案3】:

    对于来自 Google 的人:如果您只使用 QtWebKit,您确实需要将 imageformats 目录(您可以在 PYTHONDIR\lib\site-packages\PyQt4\plugins 中找到)复制到您的应用程序目录。在包含中指定 PyQt4.QtWebKit 是不够的。

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多