#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
в нужном месте работают даже значки, сохраненные извне.
Комментарии:
1. Пока это (или что-то подобное) не будет объединено, я сделал этот уродливый взлом в своем setup.py: pastebin.ca/2303611 Может быть, это поможет кому-то еще.
Ответ №3:
Для людей, пришедших сюда из Google: если вы используете только QtWebKit, вам действительно нужно скопировать каталог imageformats (который вы найдете в PYTHONDIR lib site-packages PyQt4 plugins) в каталог вашего приложения. Указываем PyQt4.QtWebKit среди включенных недостаточно.