问题描述
我正在尝试使用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
但是它确实可以正常工作。相对路径部分是关键。