首页 > 解决方案 > 使用 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

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

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 = "mrhoda@innovativecomp.com;awspilot@stuartkane.com"
    kath = "kking@stuartkane.com;mrhoda@innovativecomp.com;awspilot@stuartkane.com"


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, sticky=W)
ttk.Button(app, text="Tour Outlook", command=lambda: startfile(Vp.oot)).grid(column=1, row=3, sticky=W)
ttk.Button(app, text="How to Reset Your Password", command=lambda: startfile(Vp.pwrt)).grid(column=1, row=4, sticky=W)
ttk.Button(app, text="How to Find Internet Explorer", command=lambda: startfile(Vp.findie)).grid(column=1, row=5, sticky=W)
ttk.Button(app, text="Clone Your Browser Favorites", command=lambda: startfile(Vp.favs)).grid(column=1, row=6, sticky=W)
ttk.Button(app, text="Navigating Your Folders", command=lambda: startfile(Vp.ntdriv)).grid(column=1, row=7, sticky=W)
ttk.Button(app, text="Login/Logout Or Disconnect", command=lambda: startfile(Vp.otds)).grid(column=1, row=8, sticky=W)
ttk.Button(app, text="I need ICS Help", command=lambda: ICShelp(Vp.ptm)).grid(column=1, row=9, sticky=W)
ttk.Button(app, 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

标签: python-3.xexecutable

解决方案


我没有正确调用 pyinstaller 的相对路径。再次感谢@CoolCloud 看这个东西!感谢@NL23codes,你的回答让我走到终点。

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

但它现在确实有效。相对路径部分是关键。


推荐阅读