如何将自己的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 -F -w -i cat.ico run.py

  

 

posted @ 2023-11-29 21:02  张幼安  阅读(77)  评论(0编辑  收藏  举报