使用tkinter gui从python 3.8.5编译的Exe在Windows10上引发致命错误

问题描述

我正在尝试使用python 3.8.5和tkinter gui部署单个文件应用程序。使用pyinstaller可以创建.exe,但立即运行它会返回致命错误。我的环境 Windows 10,Atom IDE,python 3.8.5,tkinter gui

有8个mp4视频,gui按钮应该可以从gui启动。我实现了一个媒体文件夹,以保存开发环境中的所有媒体文件,无法弄清楚如何在脚本中调用它们。

from tkinter import *
from tkinter import ttk
import sys
from os import startfile
from PIL import Image,ImageTk
import win32com.client as win32

# cwd = os.getcwd()
# cfig = cwd + "/aws_guide/config.ini"  # declares the path to the videos
# print(cfig)


class Vp:
    img = '/aws_guide/media/skllp.png'
    ast = 'Accessing the Workspace for the first time.mp4'
    favs = 'Import Bookmarks.mp4'
    otds = 'Logging off-disconnecting-Rebooting.mp4'
    ntdriv = "C:/Users/mrhoda/Documents/scripts/aws_guide/Navigating Network Drives.mp4"
    oot = "C:/Users/mrhoda/Documents/scripts/aws_guide/Outlook Tour.mp4"
    pwrt = "C:/Users/mrhoda/Documents/scripts/aws_guide/Reset your password.mp4"
    aoot = "C:/Users/mrhoda/Documents/scripts/aws_guide/Setting up Outlook for the 1st time.mp4"
    findie = "C:/Users/mrhoda/Documents/scripts/aws_guide/Finding IE.mp4"
    ptm = "[email protected];[email protected]"
    kath = "[email protected];[email protected];[email protected]"


class Window(Frame):
    def __init__(self,master=None):
        Frame.__init__(self,master)
        self.master = master
        self.pack(fill=BOTH,expand=1)
        load = Image.open(Vp.img)
        render = ImageTk.PhotoImage(load)
        img = Label(self,image=render)
        img.image = render
        img.place(x=0,y=0)
        ttk.Frame(root,padding="3 3 12 12")


def ICShelp(ptm):
    outlook = win32.dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = ptm
    mail.Subject = "Workspaces Help"
    mail.HtmlBody = ""
    mail.display(True)


def imanhelp(kath):
    outlook = win32.dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = kath
    mail.Subject = "iManage Help"
    mail.HtmlBody = ""
    mail.display(True)


def err():
    # lazy error handler
    pass


def close():
    sys.exit()


root = Tk()
root.title("Getting to KNow AWS Workspaces")
app = Window(root)
root.geometry("1048x600")  # good enough for Now
root.columnconfigure(0,weight=1)
root.rowconfigure(0,weight=1)
ttk.Button(app,text="Getting Started with Workspaces",command=lambda: startfile(Vp.ast)).grid(column=1,row=1,sticky=W)
ttk.Button(app,text="Setup Outlook",command=lambda: startfile(Vp.aoot)).grid(column=1,row=2,text="Tour Outlook",command=lambda: startfile(Vp.oot)).grid(column=1,row=3,text="How to Reset Your Password",command=lambda: startfile(Vp.pwrt)).grid(column=1,row=4,text="How to Find Internet Explorer",command=lambda: startfile(Vp.findie)).grid(column=1,row=5,text="Clone Your browser Favorites",command=lambda: startfile(Vp.favs)).grid(column=1,row=6,text="Navigating Your Folders",command=lambda: startfile(Vp.ntdriv)).grid(column=1,row=7,text="Login/logout Or disconnect",command=lambda: startfile(Vp.otds)).grid(column=1,row=8,text="I need ICS Help",command=lambda: ICShelp(Vp.ptm)).grid(column=1,row=9,text="I need iManage Help",command=lambda: imanhelp(Vp.kath)).grid(column=1,row=10,sticky=W)


root.mainloop()
close()

它可以从Atom完美运行。这是我的第一个带有gui的python。非常感谢!

附录: 谢谢酷云! 它是用

编译的
pyinstaller --onefile 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/skllp.png;.' 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Accessing the Workspace for the first time.mp4;.'
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Finding IE.mp4;.' 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Import Bookmarks.mp4;.' 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Logging off-disconnecting-Rebooting.mp4;.' 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Navigating Network Drives.mp4;.' 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Outlook Tour.mp4;.' 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Rest your password.mp4;.' 
--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/media/Setting up Outlook for the 1st time.mp4;.' awstrainer.py

我在Traceback中得到了这个

C:\Users\mrhoda>C:\Users\mrhoda\Documents\scripts\aws_guide\dist\awstrainer.exe
Traceback (most recent call last):
  File "awstrainer.py",line 74,in <module>
  File "awstrainer.py",line 37,in __init__
  File "PIL\Image.py",line 2878,in open
FileNotFoundError: [Errno 2] No such file or directory: '/aws_guide/media/skllp.png'
[13800] Failed to execute script awstrainer

解决方法

我没有正确地为pyinstaller调用相对路径。再次感谢@CoolCloud查看此内容!感谢@ NL23codes,您的回答here使我走到了终点。

from tkinter import *
from tkinter import ttk
import sys
import os
from os import startfile
from PIL import Image,ImageTk
import win32com.client as win32


def resource_path(relative_path):
    """ Get absolute path to resource,works for dev and for PyInstaller """
    base_path = getattr(
        sys,'_MEIPASS',os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path,relative_path)


class Vp():
    Logo = resource_path("skllp.png")
    ast = resource_path("Accessing the Workspace for the first time.mp4")
    favs = resource_path("Import Bookmarks.mp4")
    otds = resource_path("Logging off-Disconnecting-Rebooting.mp4")
    ntdriv = resource_path("Navigating Network Drives.mp4")
    oot = resource_path("Outlook Tour.mp4")
    pwrt = resource_path("Reset your password.mp4")

.....etc

仍然需要一个大的pyinstaller命令

pyinstaller --onefile --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/skllp.png;.' --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Accessing the Workspace for the first time.mp4;.'--add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Finding IE.mp4;.' --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Import Bookmarks.mp4;.' --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Logging off-Disconnecting-Rebooting.mp4;.' --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Navigating Network Drives.mp4;.' --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Outlook Tour.mp4;.' --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Rest your password.mp4;.' --add-data 'C:/Users/mrhoda/Documents/scripts/aws_guide/Setting up Outlook for the 1st time.mp4;.' awstrainer.py

但是它确实可以正常工作。相对路径部分是关键。