在py2exe编译的Python脚本中为QImage启用JPEG支持?

时间:2009-05-20 02:33:45

标签: qt pyqt jpeg py2exe qimage

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

脚本本身运行完美,图像加载并可以操作和渲染。但是,当我尝试用py2exe“编译”这个脚本时,一切都可以工作但JPEG图像。用PNG等效代替它可以工作,但由于我的程序从网上下载图像,它们并不总是采用PNG格式,我无法将它们全部转换为另一个库。

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

我确信有一些使用PyQt和JPEG图像的应用程序,他们是如何做到的?这似乎是一项微不足道的任务,但我现在仍然坚持下去。

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

12 个答案:

答案 0 :(得分:14)

经过几个小时的绊倒同样的问题,我想在Windows Vista上分享对我有用的解决方案: 使用python2.6

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

[Paths]
Prefix = .
Plugins = .

更新:然后将你的插件内容(imageformat / sqldriver目录等)复制到exe目录。我不认为你可以从与exe相同的目录加载插件dll。有关plugon子目录的详细信息,请参阅Qt plugin doc。 (或者,省略'plugins =。'并将插件目录复制到exe目录,所以你有/plugins/imageloaders/qjpeg4.dll)。

答案 3 :(得分:1)

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

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。

答案 4 :(得分:1)

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

  • 将图书馆libqjpeg.dyliblibqgif.dylib放入 MyApp.app/Contents/plugins/imageformats/
  • 将其放入qt.conf中的MyApp.app/Contents/resources/

    [Paths]
    Prefix = .
    Binaries = .
    

在我的机器(Leopard)上,这有效。

答案 5 :(得分:0)

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

答案 6 :(得分: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,将前缀更改为./PyQt4

答案 7 :(得分:0)

在Windows上,建议的解决方案完美无缺。

但是,即使使用上面的说明,osx也无法使其正常工作。

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

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

我很想知道你做了什么让它在osx上运行。我在this guide之后安装了PyQt。

答案 8 :(得分:0)

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

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

感谢您的帮助。

答案 9 :(得分: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来完成这项工作,但如果你想保持你的目录树不那么杂乱,我确定你可以使用它。

答案 10 :(得分:0)

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

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

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

  2. 使用bundle_files选项时,需要从中删除Qt dll文件 zip文件使用--dll-excludes选项进行pyexe。

    您仍然需要以其他方式将Qt DLL复制到输出目录(例如 使用data_files选项)。

答案 11 :(得分:0)

感谢您对该问题的有用答案!我遇到了和你一样的问题,没有解决方案可以提供帮助。希望我使用VCS并发现我的应用程序的旧版本正确加载了JPEG图像,新版本停止了这样做。我使用PySide v1.2.2 抓住了这个bug。

为了启用库加载,我使用了与@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目录足以启用JPEG支持 py2exe + PySide 构建。当然,您自己的代码中必须没有问题。

我希望这能节省一天的人! ;)