8人参与 • 2025-06-04 • Vue.js
本节我们使用pywebview和vue3搭建一个简单的桌面应用示例。
1 目录结构
├── dist #python构建后的可执行程序目录 ├── python #后台python文件 ├── web #前端vue文件 ├── webdist #前端构建后的文件目录 ├── readme.md #项目说明 └── main.py python主入口文件
2 前端项目
前端使用vue3+typescript+vite+elment plus
pnpm i
pnpm dev
pnpm build
3 后端项目
后端使用python提供接口服务
获取python安装包(选择对应版本及系统)
python -v
pip install pywebview
#使用pnpm支持 #pnpm dev:py #使用python命令运行 python main.py
1 本地调试
pnpm dev
pnpm dev:py
或者直接使用python命令 python main.py
2 打包应用
pnpm build
pnpm build:py
,或直接使用pyinstaller命令生成#pnpm build:py # 本地集成合体包 pyinstaller --onefile --add-data "webdist;dist" --icon "webdist/favicon.ico" --windowed main.py
参数说明:
代码参考:pywebviewvue
1、package.json
封装了前后端项目开发、构建的快捷命令:
pnpm dev
pnpm build
pnpm dev:py
,其实运行的是python main.py
pnpm build:py
,其实执行的是pyinstaller --onefile --add-data "webdist;dist" --icon "webdist/favicon.ico" --windowed main.py
"scripts": { "dev": "vite", "build": "vite build", "dev:py": "python main.py", "build:py": "pyinstaller --onefile --windowed --icon \"webdist/favicon.ico\" --add-data \"webdist;dist\" main.py" },
2、vite.config.ts设置
由于前端项目默认构建地址为当前目录下的dist文件,而pywebview也是基于主文件的当前目录,默认构建后的文件输出为dits目录,所以为了构建文件,把前端构建文件的输出目录调整为和web、python平级的webdist目录
build:{ // 构建输出目录,相对于 root 目录 outdir: '../webdist', }
设置前端项目的入口文件和
{ "compileroptions": { "target": "es5", // 目标js的版本 "baseurl": ".", "outdir": "./webdist", "rootdir": "./web/src", "paths": { "@/*": ["web/src/*"] }, }, }
3、main.py后端入口文件说明
**注意事项**
通过pywebview提供的js_api实现vue与python的接口交互,这里需要注意的是api与window对象的挂载
def create_window(): api = jsapi.api() # 实例化 api 类 window = webview.create_window( title="pywebview vue", # 窗口标题 url=html_file_path, # 加载的 url min_size=(1000, 600), # 最小尺寸 js_api=api, # 将上面实例化后的 api 对象传给前端 js 调用 ) # --划重点--务必记得需要将上面创建的 window 对象再通过函数传给实例化后的 api 对象 api.set_window(window) webview.start(localization=chinese)
为方便调试,开发环境要设置的前端本地地址,而打包时可执行的exe文件要目录为dist目录,所以要区分根路径,否则运行main.py时,会报资源找不到
if getattr(sys, "frozen", false): # 如果是打包后的可执行文件 base_path = sys._meipass # 定义 vue 构建后的 html 文件路径 html_file_path = os.path.join(base_path, "dist", "index.html") else: # 如果是开发环境 base_path = os.path.dirname(os.path.abspath(__file__)) # 定义 vue 构建后的 html 文件路径 html_file_path = os.path.join(base_path, "http://localhost:5173")
import webview import sys import os if getattr(sys, "frozen", false): # 如果是打包后的可执行文件 base_path = sys._meipass # 定义 vue 构建后的 html 文件路径 html_file_path = os.path.join(base_path, "dist", "index.html") else: # 如果是开发环境 base_path = os.path.dirname(os.path.abspath(__file__)) # 定义 vue 构建后的 html 文件路径 html_file_path = os.path.join(base_path, "http://localhost:5173") # 定义测试对象 def get_device_info(): return {"version": "v1.0.0", "description": "pywebview集成vue示例", "environment": "pywebview+vue+ts","others":""} #定义与前端交互的api class api: def __init__(self) -> none: self._window = none def set_window(self, window): self._window = window # 获取消息 def getmessage(self): return get_device_info() # 接收前端提交的数据 def savemessage(self, data): return f"python接收到数据: {data}" # 配置 pywebview 关闭提示的中文翻译 chinese = { "global.quitconfirmation": "确定关闭?", } def create_window(): api = jsapi.api() # 实例化 api 类 window = webview.create_window( title="pywebview vue", # 窗口标题 url=html_file_path, # 加载的 url min_size=(1000, 600), # 最小尺寸 js_api=api, # 将上面实例化后的 api 对象传给前端 js 调用 ) # --划重点--务必记得需要将上面创建的 window 对象再通过函数传给实例化后的 api 对象 api.set_window(window) webview.start(localization=chinese) if __name__ == "__main__": create_window()
参考文档:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论