vue3项目使用 python +flask 打包成桌面应用

server/2025/3/30 17:11:36/

server.py

python">import os
import sys
from flask import Flask, send_from_directory# 获取静态文件路径
if getattr(sys, "frozen", False):# 如果是打包后的可执行文件base_dir = sys._MEIPASS
else:# 如果是开发环境base_dir = os.path.dirname(os.path.abspath(__file__))app = Flask(__name__, static_folder=os.path.join(base_dir, "vue_dist"), static_url_path="/")# 提供静态文件服务
# @app.route("/")
# def index():
#     return app.send_static_file("index.html")@app.route("/", defaults={"path": ""})
@app.route("/<path:path>")
def catch_all(path):return app.send_static_file("index.html")if __name__ == "__main__":app.run(port=5000)

main.py

python">import os
import sys
import ctypes
import webview
import threading
from server import app  # 引入 Flask 应用# 获取静态资源路径
def get_resource_path(relative_path):if getattr(sys, "frozen", False):# 如果是打包后的可执行文件base_path = sys._MEIPASSelse:# 如果是开发环境base_path = os.path.dirname(os.path.abspath(__file__))return os.path.join(base_path, relative_path)# 设置窗口图标(Windows 平台)
def set_window_icon(window, icon_path):try:# 加载图标文件icon_handle = ctypes.windll.user32.LoadImageW(0, icon_path, 1, 0, 0, 0x00000010)if not icon_handle:raise Exception("Failed to load icon")# 获取窗口句柄hwnd = webview.windows[0]._window_handlectypes.windll.user32.SendMessageW(hwnd, 0x0080, 0, icon_handle)  # WM_SETICONexcept Exception as e:print(f"Error setting window icon: {e}")# 启动 Flask 服务器
def run_server():app.run(port=5000)if __name__ == "__main__":# 启动 Flask 服务器(在后台线程中运行)server_thread = threading.Thread(target=run_server)server_thread.daemon = Trueserver_thread.start()# 使用 PyWebView 创建桌面窗口icon_path = get_resource_path("vue_dist/favicon.ico")window = webview.create_window("易聪云科技",  # 窗口标题url="http://localhost:5000",  # 加载 Flask 提供的页面width=1024,  # 窗口宽度height=768,  # 窗口高度resizable=True,  # 允许调整窗口大小# fullscreen=True,)# 启动 PyWebViewwebview.start()# 设置窗口图标set_window_icon(window, icon_path)

vue_dist 是vue项目打包后的dist目录,放在跟main.py同级目录下

打包命令:pyinstaller --onefile --windowed main.py --add-data “vue_dist;vue_dist”


http://www.ppmy.cn/server/179496.html

相关文章

Linux的一些常见指令

一、ls指令 语法&#xff1a; ls (选项) 功能&#xff1a; ls可以查看当前目录下的所有文件和目录。 常用选项&#xff1a; -a:列出目录下的所有文件&#xff0c;包括以点&#xff08;.&#xff09;开头的隐含文件 。-d:将目录像文件一样显示&#xff0c;不显示其下的文件。…

【大模型学习】什么是离身智能

目录 一、技术背景与历史发展 二、什么是离身智能&#xff1f; 三、技术要点及具体实现细节 四、架构 五、实际应用案例 一、技术背景与历史发展 虽然“离身智能”这个概念不如具身智能那样广为人知&#xff0c;但它代表了一种专注于数据处理和分析的人工智能发展方向。早期…

ngx_http_compile_complex_value

定义在 src\http\ngx_http_script.c ngx_int_t ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv) {ngx_str_t *v;ngx_uint_t i, n, nv, nc;ngx_array_t flushes, lengths, values, *pf, *pl, *pv;n…

级联FFT(超采样FFT架构)的MATLAB代码及原理

一、原理 该算法首先对输入时间序列的数据进行抽样&#xff0c;然后对抽样后数组内的数据进行 FFT 运算处理&#xff0c;然后进行交叉项的补偿&#xff0c;再对 FFT 之后不同数组间相同位置上的数据进行第 2 次 FFT 处理&#xff0c;从而达到一次 FFT 运算能够得到的效果。   …

gitee第三方登录获取openid | python+Django |已跑通

注&#xff1a;此项目根据美多改编&#xff0c;qq第三方需要备案gitee不用 一、获取appid和appsecret 点击右侧账号设置 左侧菜单栏数据管理里有第三方应用 点击创建应用&#xff0c;根据你的具体情况设置 二、以下是事例代码&#xff0c;根据需要修改即可 setting.py #QQ登…

针对stm32F103C8t6芯片调节USB串口的经验

1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…

计算机二级:函数基础题

函数基础题 第一题 rinput("请输入半径&#xff1a;") c3.1415926*r*2 print("{:.0f}".format(c))输出&#xff1a; Type Error第二题 a7 b2 print(a%2)输出 1第三题 ab4 def my_ab(ab,xy):abpow(ab,xy)print(ab,end"\n") my_ab(ab,2)prin…

数据库基础知识点(系列七)

视图和索引相关的语句 1&#xff0e;引入视图的主要目的是什么? 答&#xff1a;数据库的基本表是按照数据库设计人员的观点设计的&#xff0c;并不一定符合用户的需求。SQL Server 2008可以根据用户需求重新定义表的数据结构&#xff0c;这种数据结构就是视图。视图是关系数据…