2011-04-19 11 views
4

私はcx_freezeを使用してフリーズしたPyQt4プログラムを持っています。私が抱えている問題は、QGraphicsPixmapItemを作成してSVGファイルからピックスマップを作成しても問題ないですが、Pixmapはロードされないので、シーン内のアイテムだけのイメージはありません。私を混乱させることは、これがexeをビルドしたコンピュータとは別のコンピュータで実行している場合にのみ発生します。私はそれを構築したコンピュータ上でexeを実行すると、プログラムは完全に動作します。必要なすべてのpythonコンポーネントとpyqtコンポーネントがコンピュータにインストールされているコンピュータでそれを実行しようとしても、それを構築したコンピュータでなければ、pixmapはsvgファイルから読み込まれません。私はこれが私のcx_freeze setup.pyファイルに問題があるかどうか、またはメインコード内の何かを変更する必要があるかどうか、あるいは助けてくれるか、私に正しい方向に向けるだけでいいのか分かりません。私の気持ちは、cx_freezeがビルドしているときに何かが混乱してしまったので、私は以下のsetup.pyファイルの内容を貼り付けます。また、私はWindowsでPython v3.1を使用しています。フリーpyqtアプリケーションを別のコンピュータで実行しているときに画像が表示されない

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 

答えて

6

これは私が過去に自分自身に実行した厄介な問題です。 私はhttp://www.py2exe.org/index.cgi/Py2exeAndPyQtを引用してみましょう: (私はあなたがcx_freezeを使用している知っているが、私はあなたのスクリプトを適応させることができます確信しています)

PyQt4と画像の読み込み(JPG、GIF、 など)

PyQt4はにプラグインを使用していますそれらの画像 のフォーマットを読むので、 フォルダのPyQt4 \ plugins \ imageformatsを appdir \ imageformatsにコピーする必要があります。上記の の場合と同様に、data_files を使用できます。これは bundle_files onでは機能しません。

プラグインが到達可能でない場合は、それらの フォーマットで画像をロードするときに、その後、 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をコピーする必要はありませんでした。ちょうどそのように機能しました。あなただけQtWebKitを使用している場合、アプリのディレクトリに(あなたがPYTHONDIR \ libには\サイト - パッケージ\ PyQt4のプラグイン\で見つける)imageformatsディレクトリをコピーする必要性を行う:グーグルからここに来る人のために

+0

これは私が探しています答えに表示されますが、何らかの理由で、それはまだ私に与えているのと同じproblem.Iがimageformatsが終わっフォルダcoppiedとに私のアプリでqt.confファイルを変更して[OK]をimageformatsフォルダの新しい場所にリンクして、すべてが動いています。ちょうど私が間違ったフォルダにリンクするためにqt.confファイルを変更したことを確認するために、問題と同じ問題が発生したので、これは明らかにこの問題の解決策でした。私はまだcompsを変更するときにsvgファイルの依存関係が不足しているので、同じ問題です。 –

+0

私はそれを試してみると、私はそれを把握することができます参照してください。 – aukaost

+0

もう一度、助けてくれてありがとうございます。このプログラムは、Pythonフォルダの中に何らかの形で依存しています。私がPythonフォルダの名前を変更すると、同じ問題が発生します。 SVGファイルを読むために私のPythonインストールにリンクされていますが、この理由のために何がそのフォルダにリンクして戻ってくるのか分かりません。これまでのところあなたの助けをありがとう。 –

0

。インクルードの中にPyQt4.QtWebKitを指定するだけでは不十分です。

3

元のコードにPyQt4.QtGuiが含まれている場合、imageformatsを含むフックをcx_freezeに追加しました。適切な場所にimageformatsを置くと、外部に保存されたアイコンでさえも機能します。

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

+1

それがマージされるまで、私はこの醜いハックを自分のsetup.pyにしました:http://pastebin.ca/2303611多分それは他人を助けるかもしれません。 – Strayer

関連する問題