当前位置: 首页 > article >正文

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

server.py

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

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._MEIPASS
    else:
        # 如果是开发环境
        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_handle
        ctypes.windll.user32.SendMessageW(hwnd, 0x0080, 0, icon_handle)  # WM_SETICON
    except 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 = True
    server_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,
    )

    # 启动 PyWebView
    webview.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.kler.cn/a/610927.html

相关文章:

  • CMake 构建的Qt 项目中的构建套件的配置
  • 《精益创业实战》第2章“对需求性进行压力测试” 总结
  • 破局离散制造:主数据管理驱动数字化转型的实践与启示
  • Git撤回操作全场景指南:未推送与已推送,保留和不保留修改的差异处理
  • 质检LIMS系统在食品生产加工企业的应用 如何保证食品生产企业的安全
  • 区块链技术详解:应用场景与核心优势
  • Python----数据分析(足球运动员数据分析)
  • DeepSeek-V3-0324重磅升级:开源大模型的新标杆
  • 基于PSO粒子群优化的多光谱图像融合算法matlab仿真
  • 虚拟机(一):Java 篇
  • 在word中使用zotero添加参考文献并附带超链接
  • Vue.js 完全指南:从入门到精通
  • 【HTML 基础教程】HTML 元素
  • 如何使用 CSS 实现多列布局,有哪些注意事项
  • 3. 轴指令(omron 机器自动化控制器)——>MC_GearIn
  • 开启TCP-SYNcookie保护缓解网络洪水攻击,增强服务器运行的稳定性。将 TMOUT=300 添加到 /etc/profile 文件提高安全
  • centos 7 LVM管理命令
  • 预编译能否 100%防 sql 注入?
  • 图书管理系统系统-Java、SpringBoot、Vue和MySQL开发的图书馆管理系统
  • 《Matplotlib三维可视化工业实践——从分子模拟到流体力学》