如何将自己的python文件写成有GUI的exe可执行文件
1. 先看最终效果。生成了一个有猫头的exe文件;双击之后,跳出对话框如下;

2. 这个exe的作用是从一个网址去下载一个模型。需要的参数如上;endpoint, training_key等;
3. 首先写gui的代码,包括具体的从哪里取值;
import time
import requests
import argparse
import tkinter as tk
from tkinter import *
from tkinter import messagebox
class ScriptGUI(object):
def __init__(self, args):
self.args = args # save arguments
self.window = tk.Tk() # create main widget
def download_button_click(self, e1, e2, e3, e4, e5, e6):
# 获取 Entry 组件的值
endpoint = e1.get()
training_key = e2.get()
project_id = e3.get()
iteration_id = e4.get()
platform = e5.get()
export_file_path = e6.get()
# 更新 args 属性
self.args.endpoint = endpoint
self.args.training_key = training_key
self.args.project_id = project_id
self.args.iteration_id = iteration_id
self.args.platform = platform
self.args.export_file_path = export_file_path
# 调用下载函数
status = download_model_function(self.args)
if status == 1:
messagebox.showinfo("Success!", "下载成功!\n 地址为:"+ str(self.args.export_file_path))
self.window.destroy()
else:
messagebox.showinfo("Failed!", "下载失败!")
def back_button_click(self):
self.window.destroy()
def set_init_window(self):
self.window.title("Model Downloading...")
self.window.geometry("350x250+400+300")
# create 6 entry lines (for our 6 arguments)
tk.Label(self.window, text="endpoint:").grid(row=0)
tk.Label(self.window, text="training_key:").grid(row=1)
tk.Label(self.window, text="project_id:").grid(row=2)
tk.Label(self.window, text="iteration_id:").grid(row=3)
tk.Label(self.window, text="platform:").grid(row=4)
tk.Label(self.window, text="export_file_path:").grid(row=5)
e1 = tk.Entry(self.window)
e2 = tk.Entry(self.window,show='*')
e3 = tk.Entry(self.window)
e4 = tk.Entry(self.window)
e5 = tk.Entry(self.window)
e6 = tk.Entry(self.window)
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
e3.grid(row=2, column=1, padx=10, pady=5)
e4.grid(row=3, column=1, padx=10, pady=5)
e5.grid(row=4, column=1, padx=10, pady=5)
e5.insert(0,'IVS')
e6.grid(row=5, column=1, padx=10, pady=5)
tk.Button(self.window, text="下载模型", width=10, command=lambda: self.download_button_click(e1, e2, e3, e4, e5, e6)).grid(row=6, column=0, sticky="w", padx=40, pady=5)
tk.Button(self.window, text="退出", width=10, command=self.back_button_click).grid(row=6, column=1, sticky="w", padx=40, pady=5)
def run(self):
self.set_init_window()
self.window.mainloop() # run widget (display)
def parse_arguments():
parser = argparse.ArgumentParser()
parser.add_argument("-e", "--endpoint", type=str, help="EndPoint")
parser.add_argument("-t", "--training_key", type=str, help="Training Key")
parser.add_argument("-p", "--project_id", type=str, help="Project ID")
parser.add_argument("-i", "--iteration_id", type=str, help="Iteration ID")
parser.add_argument("-pl", "--platform", default="IVS", type=str, help="Platform")
parser.add_argument("-ex", "--export_file_path", type=str, help="Export file path")
return parser.parse_args()
def get_export_status(trainer, project_id, iteration_id, platform):
try:
export = trainer.export_iteration(project_id, iteration_id, platform, raw=False)
except Exception as e:
exports = trainer.get_exports(project_id, iteration_id)
for e in exports:
if e.platform == platform:
return e
raise e
return export
def wait_for_export(trainer, project_id, iteration_id, platform):
export = get_export_status(trainer, project_id, iteration_id, platform)
while export.status == "Exporting":
print("Waiting 10 seconds...")
time.sleep(10)
export = get_export_status(trainer, project_id, iteration_id, platform)
print("Export status is: ", export.status)
return export
def download_export(trainer, export, save_path):
export_file = requests.get(export.download_uri)
with open(save_path, "wb") as file:
file.write(export_file.content)
def main():
# get arguments defined by user
args = parse_arguments()
if args.endpoint is None or args.training_key is None or args.project_id is None or args.iteration_id is None or args.export_file_path is None:
print("Please provide all the arguments")
else:
gui = ScriptGUI(args)
gui.run()
def download_model_function(args):
pass
if __name__ == "__main__":
main()
4. 写好gui了,然后转换成exe; (参考:Python脚本打包成exe,看这一篇就够了!_python 打包_利白的博客-CSDN博客)
# 首先安装Pyinstaller
!pip install Pyinstaller
pyinstaller -F -w -i cat.ico run.py

5. 如果环境是linux, 安装Pyinstaller的时候,会出现意外,显示没有这样一个命令,command not found. 这个时候,需要找到pyinstaller所在虚拟环境的bin文件位置,然后将他添加到路径。

注意,命令pyinstaller都是小写字母。

浙公网安备 33010602011771号