2016-04-22 70 views
1

我将转换我的python脚本为exe文件存在问题。我使用pyinstaller。将py脚本转换为exe后出现致命错误-1(GUI tkinter)

这个致命的错误发生在我尝试启动exe文件时。

我试过标志不同的配置:

--windowed --noconsole --onefile --noupx

,但它并没有解决问题。

这是我的脚本(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时,格式不重要;它只是一种使用扩展字母表将字节,一个和零转换为字符串的方式(这会尽量减少字符串的长度)。 *“(...)我应该怎么做”*?我在前几天给出了[这个答案](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)