python-3.x - 使用 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
解决方案
我没有正确调用 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
但它现在确实有效。相对路径部分是关键。
推荐阅读
- php - PHP Regex 忽略注释行
- ios - 我的导航栏和警报标题以及底部警报标题在整个项目中变为白色
- python - 如何在光线追踪迷宫之前运行动画屏幕(python asciimatics)
- laravel - Laravel:嵌套关系中的额外关系
- static - Java EE 中的静态方法
- flutter - DioErrorType.RESPONSE 无效的媒体类型
- android - Recycler View Divider 项目未在暗模式下显示
- ios - 当我们在 AWS 设备场中运行 iOS 应用程序时,为什么我的 API 数据没有显示?
- python - C++ Qt库shiboken绑定pyd无法导入
- c++ - armhf c ++的预处理器变量