2016-04-22 10 views
1

pythonスクリプトをexeファイルに変換する際に問題があります。私はpyinstallerを使用します。pyスクリプトをexeに変換した後の致命的なエラー-1(GUI tkinter)

この致命的なエラーは、私がexeファイルを起動しようとすると発生します。

私は、フラグの異なる設定を試してみました:

は --noupx

--onefile --noconsole を--windowedが、それは問題を解決していませんでした。

これが私のスクリプト(GUI)の一部でしかありません:

#GUI 
window = tkinter.Tk() 
window.title("SAPC - Scanned Aerial Photographs Correction") 
window.geometry("300x300+500+200") 
window.iconbitmap(default='favicon.ico') 
logo1=PIL.Image.open("logo.png") 
logo2 = PIL.ImageTk.PhotoImage(logo1) 
tkinter.Label(window, text="Ver.1.0 Beta") 
tkinter.Label(window,image=logo2).grid(row=0, column=0, columnspan=2, rowspan=2, sticky=tkinter.N+tkinter.E+tkinter.S+tkinter.W) 

menubar=tkinter.Menu(window) 
filemenu = tkinter.Menu(menubar, tearoff=0) 
filemenu.add_command(label="Open", command=openfile) 
filemenu.add_command(label="Exit", command=window.quit) 

editmenu = tkinter.Menu(menubar, tearoff=0) 
editmenu.add_command(label="Template selection", command=lambda:  mainfunction()) 
editmenu.add_command(label="Marker measurement", command=lambda:  pomiarznaczka()) 
editmenu.add_command(label="Matching", command=lambda: testbutton()) 
editmenu.add_command(label="Accuracy analysis", command=lambda: analizadok()) 
editmenu.add_command(label="Transform", command=lambda: transformacja()) 
editmenu.add_command(label="Mask generator", command=lambda: maskgenerator()) 


menubar.add_cascade(label="File", menu=filemenu) 
menubar.add_cascade(label="Workflow", menu=editmenu) 

window.config(menu=menubar) 
window.mainloop() 

と私は、ファイルからの読み込みのアイコンとロゴを使用してコードの一部を削除し、再度、PYスクリプトがEXEファイルに変換するとき...それは動作します良い。

どのようにこの問題を解決しますか?アイコンとロゴが必要です。

+0

イメージをbase64文字列に変換してスクリプトに含めるとどうなりますか?変更? – jDo

+0

私はこれをどうすればいいのか分かりません。あなたは.ico形式のアイコンと.png形式のロゴが表示されているのがわかります – adamsss

+0

です。私たちがbase64を話しているときは、フォーマットは関係ありません。これは、バイト、1および0を、文字列の長さを最小にする拡張アルファベットを使用して文字列に変換する単なる方法です。 * "(...)どうすればいい?"先日、私は[これに答えました](http://stackoverflow.com/a/36720468/6004486) – jDo

答えて

1

この例外を処理するコードがないため、スクリプトがイメージファイルを見つけることができず、失敗すると思います。

私は、スクリプト自体に、またはメインスクリプトでインポートする別のpythonファイルに画像を含めます。そうすれば、パスを制御することができ、exeファイルと共にイメージをバンドルする必要もなくなります。このアプローチの完全なデモについては、my answer to this questionをご覧ください。

それの要点...

- base64で文字列

import base64 

with open(img_input, "rb") as f: 
    with open(img_output_b64, "wb") as f2: 
     f2.write(base64.b64encode(f.read())) 

に画像を変換する - メインに、img_output_b64、新たに書き込まれたファイルの内容を貼り付けあなたがここに投稿したスクリプト。元のイメージのファイル名とハッシュも保持している辞書内にある可能性があります(これにより、後で完全性を保証することができます)。画像をデコードしてファイルに再度書き込みます。

import base64 

with open(original_image_filename, "wb") as f: 
    f.write(base64.b64decode(image_encoded_as_base64)) 

- 今、あなたはあなたがここに投稿したスクリプトでやっているようにそれをロードすることができるはずです。

window.iconbitmap(default=original_image_filename)