将py脚本转换为exe(GUI tkinter)后发生致命错误-1

时间:2016-04-22 11:09:24

标签: python-3.x tkinter exe pyinstaller

我将python脚本转换为exe文件时遇到问题。我使用pyinstaller。

当我尝试启动exe文件时,会发生此致命错误。

我尝试了不同的标志配置:

  

- 窗   --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文件时......它工作正常。

我如何解决这个问题?图标和徽标是必要的。

1 个答案:

答案 0 :(得分:1)

我猜测脚本无法找到图像文件而失败,因为没有代码可以处理此异常。

我会将图像包含在脚本本身中,或者包含在主脚本中导入的单独python文件中。这样您就可以控制路径,也无需将图像与exe文件捆绑在一起。查看my answer to this question以获取此方法的完整演示。

它的要点......

1 - 将图片转换为base64字符串

import base64

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

2 - 将新编写文件img_output_b64的内容粘贴到您在此处发布的主脚本中;也许在一个字典中也包含文件名和原始图像的哈希值(因此您可以在以后确保完整性)。解码并再次将图像写入文件。

import base64

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

3 - 现在,您应该能够像您在此处发布的脚本中一样加载它。

window.iconbitmap(default=original_image_filename)