Изображения не отображаются при запуске замороженного приложения pyqt на другом компьютере

#python-3.x #pyqt #pyqt4 #cx-freeze

#python-3.x #pyqt #pyqt4 #cx-freeze

Вопрос:

У меня есть программа PyQt4, которую я заморозил с помощью cx_freeze. Проблема, с которой я сталкиваюсь, заключается в том, что когда я создаю QGraphicsPixmapItem, который получает свое пиксельное изображение, созданное из SVG-файла, элемент создается без проблем, но пиксельное изображение не загружается, поэтому в сцене нет изображения, только элемент. Меня смущает то, что это происходит только тогда, когда я запускаю его на другом компьютере, отличном от того, на котором был создан exe. Когда я запускаю exe-файл на компьютере, на котором он был создан, программа работает отлично. Даже когда я пытаюсь запустить его на компьютере со всеми необходимыми компонентами python и pyqt, установленными на компьютере, если это не компьютер, который его создал, пиксельная карта не загружается из svg-файла. Я не уверен, что это проблема с моим cx_freeze setup.py файл или если мне нужно что-то изменить в основном коде, так что любая помощь или просто указание правильного направления будет отличной. У меня такое чувство, что что-то перепутывается, когда cx_freeze создает его, поэтому я вставлю содержимое моего setup.py файл ниже. Также я работаю в Windows, используя Python версии v3.1.

 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
  

Ответ №1:

Это неприятная проблема, с которой я сталкивался сам в прошлом. Позвольте мне процитировать 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 при загрузке изображения в этих форматах.

testapp.py:

 from PyQt4 import QtGui, QtSvg
import sys

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

setup.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 — это работало именно так.

Комментарии:

1. Хорошо, итак, это соответствует ответу, который я ищу, но по какой-то причине он все еще вызывает у меня ту же проблему. Я скопировал папку imageformats и изменил файл qt.conf в моем приложении, чтобы связать с новым расположением папки imageformats, и все работало по-прежнему. Просто чтобы убедиться, что я изменил файл qt.conf на ссылку не в ту папку, и это вызвало ту же проблему, что и вопрос, так что это, очевидно, было решением этой проблемы, за исключением того, что когда я перенес свое приложение на новый компьютер, я все еще получаю ту же проблему, поэтому мне все еще не хватает зависимости для файлов svg при смене компиляторов.

2. Я попробую сам и посмотрю, смогу ли я в этом разобраться.

3. Спасибо за помощь, еще одна вещь, на которую следует обратить внимание. Программа все еще каким-то образом зависит от чего-то в папке Python. Когда я меняю имя моей папки Python, это вызывает ту же проблему. Итак, очевидно, что я все еще связан с моей установкой Python для чтения файлов SVG, но я не знаю, что заставляет его ссылаться на эту папку по этой одной причине. Еще раз спасибо за вашу помощь на данный момент.

4. Я обновил ответ примером, который сработал для меня. Вы могли бы попробовать это в своей программе установки, чтобы увидеть, работает ли это и у вас. Может быть, вы можете написать небольшой пример программы, которая повторяет вашу проблему? Я использовал cx_freeze 4.2.3, если это имеет какое-либо значение.

5. значит, вы просто использовали этот установочный файл? Обязательно ли было копировать файл qt.conf или каталог imageformat?

Ответ №2:

Я добавил перехват, cx_freeze который включает imageformats всякий PyQt4.QtGui раз, когда он включен в исходный код. При imageformats в нужном месте работают даже значки, сохраненные извне.

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

Комментарии:

1. Пока это (или что-то подобное) не будет объединено, я сделал этот уродливый взлом в своем setup.py: pastebin.ca/2303611 Может быть, это поможет кому-то еще.

Ответ №3:

Для людей, пришедших сюда из Google: если вы используете только QtWebKit, вам действительно нужно скопировать каталог imageformats (который вы найдете в PYTHONDIR lib site-packages PyQt4 plugins) в каталог вашего приложения. Указываем PyQt4.QtWebKit среди включенных недостаточно.