Изображения не отображаются при запуске замороженного приложения pyqt на другом компьютере - PullRequest
4 голосов
/ 19 апреля 2011

У меня есть программа PyQt4, которую я заморозил с помощью cx_freeze. Проблема, с которой я сталкиваюсь, заключается в том, что когда я делаю QGraphicsPixmapItem, который получает свое растровое изображение, созданное из файла SVG, элемент не создает проблем, но Pixmap не загружается, поэтому в сцене нет изображения, просто элемент , Меня смущает то, что это происходит только тогда, когда я запускаю его на компьютере, отличном от того, на котором был создан исполняемый файл. Когда я запускаю 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

Ответы [ 3 ]

6 голосов
/ 20 апреля 2011

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

3 голосов
/ 13 декабря 2012

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

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

0 голосов
/ 23 февраля 2012

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

...