4

我有一个使用 cx_freeze 冻结的 PyQt4 程序。我遇到的问题是,当我制作 QGraphicsPixmapItem 时,它正在获取由 SVG 文件制作的像素图,项目没有问题,但像素图没有加载,所以场景中没有图像只有项目. 让我感到困惑的是,这只发生在我在与构建 exe 的计算机不同的计算机上运行它时。当我在构建它的计算机上运行 exe 时,程序运行良好。即使我尝试在计算机上安装所有必需的 python 组件和 pyqt 组件的计算机上运行它,如果不是构建它的计算机,pixmap 也不会从 svg 文件加载。我不确定这是否是我的 cx_freeze 设置的问题。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
4

3 回答 3

6

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

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

PyQt4 使用插件来读取这些图像格式,因此您需要将文件夹 PyQt4\plugins\imageformats 复制到 appdir \imageformats。与上述情况一样,您可以为此使用 data_files。这不适用于 bundle_files 。

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

测试应用程序.py:

from PyQt4 import QtGui, QtSvg
import sys

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

设置.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 - 它就像那样工作。

于 2011-04-19T20:32:13.793 回答
3

我已经添加了一个钩子,cx_freeze其中包括原始代码中包含的imageformats任何时间。PyQt4.QtGuiimageformats正确的位置,即使是外部存储的图标也可以工作。

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

于 2012-12-13T14:37:37.263 回答
0

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

于 2012-02-23T19:51:28.420 回答