Я пытаюсь использовать изображение JPEG в объекте QImage из Python script с PyQt4.
Сам script отлично работает, изображение загружается, и его можно манипулировать и визуализировать, и все. Однако, когда я пытаюсь "скомпилировать" этот script с py2exe, все работает, но изображение JPEG. Замена его на эквивалент PNG работает, но поскольку моя программа загружает изображения из Интернета, они не всегда будут в формате PNG, и я не могу позволить себе преобразовать их в другую библиотеку.
Я обнаружил, что поддержка изображений JPEG для QImage наряду с другими форматами изображений предоставляется некоторыми DLL в каталоге \qt\plugins\imagesformats (они называются qjpeg4.dll и qjpeg4d.dll). Я думаю, что мне нужно как-то использовать их в своем исполняемом файле, но я не знаю, как это сделать. Я попробовал просто скопировать их в каталог exe, не повезло. Я пробовал, как указанный здесь, чтобы включить эти файлы в файлы данных в файл setup.py script, но не повезло (похоже все, что он делает, это копирование этих файлов в каталог exe, поэтому он ничего не меняет при копировании вручную).
Я уверен, что там есть несколько приложений, использующих PyQt с изображениями в формате JPEG, как они это делают? Это казалось тривиальной задачей, но я застрял на ней сейчас.
Кроме того, я хочу, чтобы мое приложение было кросс-платформенным (почему еще я буду кодировать в Python?), я надеюсь, что не буду сталкиваться с такими проблемами упаковки (это не единственный) при упаковке для OS X или Linux. Будет ли я?
Ответ 1
После нескольких часов спотыкания с той же проблемой Id хотел бы поделиться решением, которое сработало для меня в Windows Vista:
используя python2.6
скопируйте следующий каталог в каталог dist, сгенерированный py2exe:
C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats
Я просто уронил каталог imageformats непосредственно в каталог dist, без каких-либо дополнительных изменений в qt.conf или что-то в этом роде. Я не пробовал это, но это может работать и на фонон.
Ответ 2
Я должен признаться, что мне никогда не удалось получить комбинацию 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 - и слайды на английском языке и содержат текущий адрес электронной почты сопровождающего, поэтому они должны помочь! (И пусть все лоббируют текущего сопровождающего, чтобы обновить документы...! -)
Ответ 3
Попробуйте добавить файл qt.conf в ваш каталог exe, чтобы указать qt, где найти бинарные файлы и плагины.
Что-то вроде следующих работ для простого случая, где вы просто сбрасываете все dll в том же каталоге, что и exe:
[Paths]
Prefix = .
Plugins = .
Обновление. Затем скопируйте содержимое плагинов (каталоги imageformat/sqldriver и т.д.) в exe-каталог. Я не думаю, что вы можете загрузить плагины DLL из того же каталога, что и exe. Подробнее о подключаемых подкаталогах см. Qt plugin doc. (Или, оставьте "плагины =." И скопируйте каталог плагинов в exe dir, поэтому у вас есть/plugins/imageloaders/qjpeg4.dll).
Ответ 4
Этьен - Спасибо за подсказку. После долгих чтений и пробных ошибок я пришел к такому же выводу: используйте PIL, чтобы показать jpegs в созданном py2app приложении.
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.
Ответ 5
Я на OSX Leopard.
Предположим, что у вас есть приложение MyApp.app
.
На моей машине (Leopard) это работает.
Ответ 6
После попытки всех вышеупомянутых решений напрасно, я просто закончил использование PIL для загрузки изображений. Поскольку я хотел преобразовать эти изображения в текстуру в виджет OpenGL Qt, результат был таким же, независимо от того, загружаю ли я изображение с помощью Qt или PIL. Тем не менее, я сбиаю с толку, что такая основная вещь, как загрузка JPEG, настолько сложна в графической библиотеке, которая широко известна и широко используется как Qt.
Ответ 7
У меня была такая же проблема. Исправлено: http://mail.python.org/pipermail/python-list/2008-June/669374.html
- Скопируйте плагины Qt в каталог: $YOUR_DIST_PATH/PyQt4/плагины;
- Скопируйте qt.conf в каталог dist,
- Редактировать qt.conf, изменить префикс на. /PyQt 4
Ответ 8
на окнах, предлагаемые решения работают отлично.
однако, в osx не может заставить его работать даже с инструкциями выше.
Вопрос : файлы libqjpeg.dylib
и libqgif.dylib
находятся в каталоге /Developer/Applications/Qt/plugins/imageformats/
, и если вы установили Qt самостоятельно, а не только PyQt. эти файлы не работают для меня.
в дистрибутиве PyQt, я вижу файлы libqjpeg.bundle
и libqgif.bundle
в /opt/local/libexec/qt4-mac/plugins/imageformats/
, но это не библиотеки, и btw я тоже не могу открыть их содержимое, даже если у них есть расширение .bundle. использование этих файлов также не работает.
Мне любопытно узнать, что вы сделали, чтобы заставить его работать над osx. я установил PyQt после это руководство.
Ответ 9
Для меня проблема была решена, просто скопировав "qt.conf" для каталога исполняемого файла.
Вы можете найти "qt.conf" в... \PythonXX\Lib\site-packages\PyQt4\qt.conf.
Спасибо за помощь.
Ответ 10
Все вышеизложенное не удалось для меня, пока я не понял, что я связывал .exe(то есть, у меня была опция "bundle_files": 2 в моей setup.py. Я изменил ее на 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, чтобы сделать эту работу, хотя я уверен, что вы можете использовать ее, если хотите, чтобы ваше дерево каталогов было менее загромождено.
Ответ 11
Можно использовать плагин JPEG с py2exe'd script, даже используя bundle_files. Вам нужно устроить две вещи, чтобы это нормально работало:
-
Скопировать PyQt4/plugins/imageformats в выходной каталог py2exe (по умолчанию: dist
)
Вам нужно только скопировать нужные вам форматы.
-
При использовании опции bundle_files вам необходимо вывести файлы Qt dll из
zipfile, используя параметр --dll-excludes
для pyexe.
Вам все равно придется копировать Qt DLL в выходной каталог каким-либо другим способом (например,
используя опцию data_files
).
Ответ 12
Спасибо за ваши полезные ответы на вопрос! Я столкнулся с той же проблемой, что и вы, и никакие решения не помогли. Надеюсь, я использовал 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
достаточно, чтобы включить поддержку JPEG в py2exe + PySide построить. Конечно, у вас не должно быть проблем с вашим собственным кодом.
Я надеюсь, что это спасет кого-нибудь в день!;)