我正在尝试使用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操作系统。我会吗?
答案 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。
我猜测py2exe / Windows的解决方案不一定适用于py2app / OSX。
答案 4 :(得分:1)
我在OSX Leopard上。
假设您有一个应用程序MyApp.app
。
libqjpeg.dylib
和libqgif.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
答案 7 :(得分:0)
但是,即使使用上面的说明,osx也无法使其正常工作。
问题是:libqjpeg.dylib
和libqgif.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脚本一起使用。您需要安排两件事才能使其正常工作:
将PyQt4 / plugins / imageformats复制到py2exe的输出目录(默认值:dist
)
您只需要复制实际需要的格式。
使用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 构建。当然,您自己的代码中必须没有问题。
我希望这能节省一天的人! ;)