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

Fatal error -1 after convert py script to exe (GUI tkinter)

我在将 python 脚本转换为 exe 文件时遇到问题。我用的是pyinstaller.

当我尝试启动 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 文件时...它工作正常。

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

我猜测脚本找不到图像文件并失败,因为没有代码来处理这个异常。

我会将图像包含在脚本本身或您在主脚本中导入的单独 python 文件中。这样您就可以控制路径,并且还消除了将图像与 exe 文件捆绑在一起的需要。查看 以获得此方法的完整演示。

要点...

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)