使用 pyinstaller 将 .py 转换为 .exe 后,Exe 文件无法启动

Exe file wont launch after converting .py to .exe with pyinstaller

我有一个 minecraft 项目,在使用以下命令将其转换为 exe 后:

pyinstaller "F:\pythonprojetcs\minecraft file mover\splashscreen.py" -F --icon="F:\pythonprojetcs\minecraft file mover\app.ico"

它不会启动。这是错误:

Traceback (most recent call last):
  File "splashscreen.py", line 21, in <module>
    image = tk.PhotoImage(file=image_file)
  File "tkinter\__init__.py", line 4064, in __init__
  File "tkinter\__init__.py", line 4009, in __init__
_tkinter.TclError: couldn't open "C:\Users\REINER~1\AppData\Local\Temp\_MEI248722\data\image.png": no such file or directory
[4692] Failed to execute script splashscreen

.py 格式时它工作正常,但有错误。 它说 tkinter 是错误的,但我不明白。

代码:

# create a splash screen, 80% of display screen size, centered,
# displaying a GIF image with needed info, disappearing after 5 seconds
import os
import tkinter as tk
import shutil
import time


root = tk.Tk()
root.overrideredirect(True)
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry('%dx%d+%d+%d' % (width*0.8, height*0.8, width*0.1, height*0.1))

image_file = os.path.dirname(__file__) + '\data\image.png'
image = tk.PhotoImage(file=image_file)
canvas = tk.Canvas(root, height=height*0.8, width=width*0.8, bg="brown")
canvas.create_image(width*0.8/2, height*0.8/2, image=image)
canvas.pack()

root.after(2000, root.destroy)
root.mainloop()

print("Világ vagy textúrát akkarsz? (világ = 1 / textúra = 2 / világ másolás = 3 / tutorial = 4)")
choosing = input()

if choosing == "1":
    print("\n")
    print("\n")
    print("Ok, szóval világ.")
    print("Hol van?")
    original = input()
    target = 'C:\Users\Refi\AppData\Roaming\.minecraft\saves'
    shutil.move(original,target)
    time.sleep(1)
    print("Kész!")
    print("Ha ezt írja ki: FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\Reiner Regő\Downloads\test', akkor az a fálj nem létezik!")
    print("Kérlek várj! Ne zárd be!")
    time.sleep(3)
if choosing == "2":
    print("\n")
    print("\n")
    print("Ok, szóval textúra.")
    print("Hol van?")
    original = input()
    target = 'C:\Users\Refi\AppData\Roaming\.minecraft\resourcepacks'
    shutil.move(original,target)
    time.sleep(1)
    print("Kész!")
    print("Ha ezt írja ki: FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\Reiner Regő\Downloads\test', akkor az a fálj nem létezik!")
    print("Kérlek várj! Ne zárd be!")
    time.sleep(3)

if choosing == "3":
    print("\n")
    print("\n")
    print("Ok, szóval világot akarsz másolni.")
    print("Mi a neve?")
    inputfromuser = input()
    original = 'C:\Users\Refi\AppData\Roaming\.minecraft\saves\' + inputfromuser
    target = 'D:'
    shutil.move(original,target)
    time.sleep(1)
    print("Kész! A D:-ben fogod megtlálni!")
    print("Ha ezt írja ki: FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\Refi\Downloads', akkor az a fálj nem létezik!")
    print("Kérlek várj! Ne zárd be!")
    time.sleep(3)

    print('\n')
    input("nyomd meg az entert a kilépéshez")

这会将文件从一个目录复制到另一个目录,启动画面代码只是一个示例。 请帮忙!

您的脚本试图从与脚本本身相关的目录访问图像文件;这在脚本安装解压时有效,资源实际上在文件系统上。但是当捆绑到一个可执行文件中时,那是行不通的;图像不会在那里,除非你已经将它复制到可执行文件中(一个丑陋的解决方案);您需要将其捆绑到可执行文件本身,以便您的脚本可以在运行时提取它。

您需要阅读the docs on spec files, specifically, adding data files (to bundle the data with the executable when you build it) and using data files from a module(以在运行时提取内存中的捆绑数据)。

您将只能访问文件中的 数据,它不再是磁盘上的文件,因此您需要 use alternate means of loading, e.g. from base64 encoded data .