10

我正在尝试通过 PyQt4 在 Python 脚本的 QImage 对象中使用 JPEG 图像。

脚本本身完美运行,图像加载并且可以被操纵和渲染等等。但是,当我尝试用 py2exe“编译”这个脚本时,除了 JPEG 图像之外,一切正常。用等效的PNG替换它,但由于我的程序从网上下载图像,它们并不总是PNG格式,我不能用另一个库将它们全部转换。

我发现 QImage 的 JPEG 图像支持以及其他图像格式是由 \qt\plugins\imageformats 目录中的一些 DLL 提供的(它们被称为 qjpeg4.dll 和 qjpeg4d.dll)。我想我需要在我的可执行文件中以某种方式使用它们,但我不知道如何。我试过简单地将它们复制到我的 exe 目录,没有运气。如此处所示,我已尝试将这些文件作为 data_files 包含在 setup.py 脚本中,但没有运气(看起来它所做的只是将这些文件复制到 exe 的目录中,因此无论如何手动复制它们并没有改变)。

我敢肯定有一些应用程序使用 PyQt 和 JPEG 图像,他们是怎么做到的?这似乎是一项微不足道的任务,但我现在坚持下去。

另外,我希望我的应用程序是跨平台的(为什么还要用 Python 编码?),我希望在为 OS X 或 Linux 打包时不会遇到这样的打包问题(这不是唯一的问题)。我会吗?

4

12 回答 12

14

经过几个小时在同一个问题上磕磕绊绊,我想分享在 windows vista 上对我有用的解决方案:使用 python2.6

将以下目录复制到 py2exe 生成的 dist 目录中:

C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats

我只是将 imageformats 目录直接放到了我的 dist 目录中,没有对 qt.conf 或类似的东西做任何进一步的修改。我还没有尝试过,但这也可能适用于声子。

于 2009-12-07T17:18:19.890 回答
1

我不得不承认,我从来没有设法让 py2exe + pyqt 组合完全正确(而且,py2exe 对跨平台打包根本没有帮助)。PyInstaller 似乎要好得多—— http://www.pyinstaller.org/上的文档很旧,但 svn 主干是更新的。一些文档在最近的 Pycon Italia Tre 会议上给出的幻灯片中——http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf——并且,幻灯片在英文,并包含当前维护者的电子邮件,所以他们应该提供帮助!(而且,让我们都游说当前的维护者更新文档......!-)

于 2009-05-20T02:56:07.080 回答
1

尝试将qt.conf文件添加到您的 exe 目录中,以告诉 qt 在哪里可以找到二进制文件和插件。

以下内容适用于简单的情况,您只需将所有 dll 转储到与 exe 相同的目录中:

[Paths]
Prefix = .
Plugins = .

更新:然后将您的插件内容(imageformat/sqldriver 目录等)复制到 exe 目录。我认为您不能从与 exe 相同的目录中加载插件 dll。有关插件子目录的详细信息,请参阅Qt 插件文档。(或者,省略 'plugins = .' 并将 plugins 目录复制到 exe 目录,这样你就有了 /plugins/imageloaders/qjpeg4.dll)。

于 2009-05-22T22:30:32.860 回答
1

艾蒂安——谢谢你的提示。经过大量阅读和反复试验,我得出了相同的结论:使用 PIL 在 py2app 生成的应用程序中显示 jpeg。

http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/

我猜想为 py2exe/Windows 提出的解决方案不一定适用于 py2app/OSX。

于 2009-08-27T21:08:47.117 回答
1

我在 OSX Leopard 上。假设您有一个应用程序MyApp.app

  • 把图书馆libqjpeg.dyliblibqgif.dylib
    MyApp.app/Contents/plugins/imageformats/
  • 把它放进qt.confMyApp.app/Contents/resources/

    [Paths]
    Prefix = .
    Binaries = .
    

在我的机器(Leopard)上这个工作。

于 2009-09-21T19:51:35.410 回答
0

在徒劳地尝试了上述所有解决方案之后,我最终使用 PIL 来加载我的图像。由于我想将这些图像转换为 OpenGL Qt 小部件中的纹理,因此无论我使用 Qt 还是 PIL 加载图像,结果都是相同的。尽管如此,我仍然感到困惑的是,在像 Qt 一样广为人知和广泛使用的 GUI 库中,加载 JPEG 这样的基本事情是如此复杂。

于 2009-05-27T22:46:03.663 回答
0

我有同样的问题。使用此修复它:http: //mail.python.org/pipermail/python-list/2008-June/669374.html

  1. 将Qt插件复制到目录:$YOUR_DIST_PATH/PyQt4/plugins;
  2. 复制 qt.conf 到你的 dist 目录;
  3. 编辑 qt.conf,将 Prefix 更改为 ./PyQt4
于 2009-06-02T08:31:28.633 回答
0

在 Windows 上,建议的解决方案可以完美运行。

但是,即使按照上面的说明,在 osx 上也无法使其工作。

问题是:libqjpeg.dylibandlibqgif.dylib文件位于/Developer/Applications/Qt/plugins/imageformats/目录中,而且如果你已经安装了Qt本身,而不仅仅是PyQt。这些文件对我不起作用。

在 PyQt 发行版中,我看到了文件libqjpeg.bundlelibqgif.bundlein /opt/local/libexec/qt4-mac/plugins/imageformats/,但是这些不是库,顺便说一句,即使它们具有 .bundle 扩展名,我也无法打开它们的内容。使用这些文件也不起作用。

我很想知道你做了什么让它在 osx 上工作。我已经按照本指南安装了 PyQt 。

于 2009-09-26T13:29:26.013 回答
0

对我来说,只需复制可执行文件目录的“qt.conf”即可解决问题。

您可以在 ...\PythonXX\Lib\site-packages\PyQt4\qt.conf 中找到“qt.conf”。

感谢帮助。

于 2010-01-12T12:57:09.850 回答
0

上面的一切对我来说都失败了,直到我意识到我正在捆绑.exe(也就是说,我的 setup.py 中有选项“bundle_files”:2。我将其更改为 bundle_files = 2,现在它工作得很好。

上述解决方案都很好。具体来说,我刚刚在 setup.py 中添加了以下行: data = [ ("imageformats", glob.glob("C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats*.dll")) ]

(当然,除了其他文件)。

然后,图像加载 dll 位于 MY_EXE_DIR/imageformats

我不需要 qt.conf 来完成这项工作,但如果你想让你的目录树不那么混乱,我相信你可以使用它。

于 2010-12-14T20:21:58.223 回答
0

即使使用 bundle_files,也可以将 JPEG 插件与 py2exe 脚本一起使用。您需要安排两件事才能使其正常工作:

  1. 复制 PyQt4/plugins/imageformats 到 py2exe 的输出目录(默认:dist

    您只需复制您实际需要的格式。

  2. 使用 bundle_files 选项时,您需要使用 pyexe 选项从 zipfile 中排除 Qt dll 文件--dll-excludes

    您仍然必须通过其他方式(例如使用data_files选项)将 Qt DLL 复制到输出目录。

于 2011-04-21T13:58:34.770 回答
0

感谢您对问题的有用回答!我遇到了与您相同的问题,没有解决方案可以提供帮助。希望我在使用 VCS 时发现我的应用程序的旧版本正确加载了 JPEG 图像,而新版本停止了它。我使用 PySide v1.2.2 发现了这个错误

为了启用库加载,我使用了与@Macke 相同的解决方案(即添加和编辑了 qt.conf)。

接下来是我的 qt.conf:

[Paths]
Binaries = .
Plugins = qtplugins

C:\Python27\Lib\site-packages\PySide\plugins directory被复制到qtplugins目录,所以我有下一个目录:

qtplugins\accessible
qtplugins\codecs
qtplugins\graphicssystems
qtplugins\iconengines
qtplugins\imageformats

我有下一个代码:

class NotesCalendar(QtGui.QCalendarWidget):
    note_icon = QtGui.QImage("res/16note.png")

将类变量移动NotesCalendar.note_icon到构造函数解决了这个问题,Qt 开始正确加载它的库。似乎类变量构造函数中断了一些内部 PySide 的东西。

它在 Windows 上没有问题。 指定正确qt.conf的复制plugins目录就足以在py2exe + PySide构建中启用 JPEG 支持。当然,你自己的代码一定没有问题。

我希望这可以节省一天的时间!;)

于 2016-10-05T23:02:39.493 回答