使用vscode搭建pywebview集成vue项目示例
文章目录
- 前言
- 环境准备
- 项目源码下载
- 一、项目说明
- 1 目录结构
- 2 前端项目
- 3 后端项目
- 获取python安装包(选择对应版本及系统)
- 三、调试与生成可执行文件
- 1 本地调试
- 2 打包应用
- 四、核心代码说明
- 1、package.json
- 2、vite.config.ts设置
- 3、main.py后端入口文件说明
- 参考文档
前言
本节我们使用pywebview和vue3搭建一个简单的桌面应用示例。
环境准备
- 1、工具:VSCode
- 2、环境:python、pywebview、vue3+typesrcipt+vite
- 3、前端UI:Element Plus
项目源码下载
Gitee源码地址:https://gitee.com/lqh4188/pywebview-vue
一、项目说明
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安装包(选择对应版本及系统)
- 下载地址: https://www.python.org/downloads/
- 查看本地版本号:
python -V - 安装pywebview
pip install pywebview
- 运行应用
#使用pnpm支持
#pnpm dev:py
#使用python命令运行
python main.py
三、调试与生成可执行文件
1 本地调试
- 启动前端项目:
pnpm dev - 启动pywebview:
pnpm dev:py或者直接使用python命令python main.py
2 打包应用
- 首页进行前端项目打包:
pnpm build - 构建python可执行文件:
pnpm build:py,或直接使用pyinstaller命令生成
#pnpm build:py
# 本地集成合体包
pyinstaller --onefile --add-data "webdist;dist" --icon "webdist/favicon.ico" --windowed main.py
参数说明:
- –add-data “webdist;dist”:将前端静态资源添加到程序目录
- –icon “webdist/favicon.ico”:添加自定义图标
- 其他参数参考pyinstaller参数说明
四、核心代码说明
代码参考:PywebviewVue
1、package.json
封装了前后端项目开发、构建的快捷命令:
- 前端项目启动:
pnpm dev - 前端项目构建:
pnpm build - 启动后端项目:
pnpm dev:py,其实运行的是python main.py - 打包成exe可执行文件:
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目录
- vite.config.ts
build:{// 构建输出目录,相对于 root 目录outDir: '../webdist',
}
- tsconfig.json
设置前端项目的入口文件和
{"compilerOptions": {"target": "ES5", // 目标js的版本"baseUrl": ".","outDir": "./webdist","rootDir": "./web/src","paths": {"@/*": ["web/src/*"]},},
}
3、main.py后端入口文件说明
**注意事项**
- python 与 vue的交互
通过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, # 加载的 URLmin_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")
- 完整的main.py代码如下:
import webview
import sys
import osif 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 = Nonedef 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, # 加载的 URLmin_size=(1000, 600), # 最小尺寸 js_api=api, # 将上面实例化后的 Api 对象传给前端 js 调用 )# --划重点--务必记得需要将上面创建的 window 对象再通过函数传给实例化后的 api 对象api.set_window(window)webview.start(localization=chinese)if __name__ == "__main__":create_window()
参考文档
- pywebview文档
- 程序源码:PywebviewVue
相关文章:
使用vscode搭建pywebview集成vue项目示例
文章目录 前言环境准备项目源码下载一、项目说明1 目录结构2 前端项目3 后端项目获取python安装包(选择对应版本及系统) 三、调试与生成可执行文件1 本地调试2 打包应用 四、核心代码说明1、package.json2、vite.config.ts设置3、main.py后端入口文件说明 参考文档 前言 本节我…...
蓝桥杯嵌入式十六届模拟三
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…...
onedav一为导航批量自动化导入网址(完整教程)
OneNav作为一个功能强大的导航工具,支持后台管理、加密链接、浏览器书签批量导入等功能,能够帮助用户轻松打造专属的导航页面。今天,我将为大家详细介绍如何实现OneNav导航站的批量自动化导入网址。 1、建立要批量导入的表格 格局需要创建表格,表格的要求是一定要有需要,…...
Linux之编辑器vim命令
vi/vim命令: 终端下编辑文件的首选工具,号称编辑器之神 基本上分为三种模式,分别是 命令模式(command mode)>输入vi的命令和快捷键,默认打开文件的时候的模式插入模式(insert mode&#x…...
备赛蓝桥杯之第十六届模拟赛2期职业院校组第四题:地址识别
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
多模态自动驾驶混合渲染HRMAD:将NeRF和3DGS进行感知验证和端到端AD测试
基于3DGS和NeRF的三维重建技术在过去的一年中取得了快速的进步,动态模型也变得越来越普遍,然而这些模型仅限于处理原始轨迹域内的对象。 HRMAD作为一种混合方案,将传统的基于网格的动态三维神经重建和物理渲染优势结合,支持在任意…...
mac m3 pro 部署 stable diffusion webui
什么是Stable Diffusion WebUI ? Stable Diffusion WebUI 是一个基于Stable Diffusion模型开发的图形用户界面(GUI)工具。通过这个工具,我们可以很方便的基于提示词,描述一段文本来指导模型生成相应的图像。相比较通过…...
多层感知机实现
激活函数 非线性 ReLU函数 修正线性单元 rectified linear unit relu(x)max(0,x) relu的导数: sigmoid函数 s i g m o i d ( x ) 1 1 e − x sigmoid(x)\frac{1}{1e^{-x}} sigmoid(x)1e−x1 是一个早期的激活函数 缺点是: 幂运算相对耗时&…...
ngx_http_index_set_index
定义在 src\http\modules\ngx_http_index_module.c static char * ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_index_loc_conf_t *ilcf conf;ngx_str_t *value;ngx_uint_t i, n;ngx_http_inde…...
怎样实现CAN数据的接收和发送?
在裸机环境下实现CAN数据的接收和发送,需要通过 硬件寄存器操作 或 HAL库函数 结合 手动实现的队列 来完成。以下是完整的接收和发送流程实现: 1. 硬件初始化 首先初始化CAN控制器和GPIO: void CAN_Init(void) {// 1. 使能CAN时钟__HAL_RCC…...
Linux笔记---动静态库(使用篇)
目录 1. 库的概念 2. 静态库(Static Libraries) 2.1 静态库的制作 2.2 静态库的使用 2.2.1 显式指定库文件及头文件路径 2.2.2 将库文件安装到系统目录 2.2.3 将头文件安装到系统目录 3. 动态库 3.1 动态库的制作 3.2 动态库的使用 3.2.1 显式…...
关于matlab和python谁快的问题
关于matlab和python谁快的问题,python比matlab在乘法上快10倍,指数计算快4倍,加减运算持平,略慢于matlab。或许matlab只适合求解特征值。 import torch import timen 50000 # 矩阵规模 M torch.rand(n, 31)start_time time.t…...
基于 ffmpeg 实现合并视频
ffmpeg是一个强大的多媒体处理工具,支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…...
手机销售终端MPR+LTC项目项目总体方案P183(183页PPT)(文末有下载方式)
资料解读:手机销售终端 MPRLTC 项目项目总体方案 详细资料请看本解读文章的最后内容。在当今竞争激烈的市场环境下,企业的销售模式和流程对于其发展起着至关重要的作用。华为终端正处于销售模式转型的关键时期,波士顿 - 华为销售终端 MPRLTC …...
【Python LeetCode Patterns】刷力扣,15 个学习模式总结
1. 前缀和(Prefix Sum)—— 查询子数组中元素和303. 区域和检索 - 数组不可变304. 二维区域和检索 - 矩阵不可变 2. 双指针(Two Pointers)—— 移向彼此或远离彼此3. 滑动窗口(Sliding Window)—— 找到满足…...
蓝桥杯单片机刷题——串口发送显示
设计要求 通过串口接收字符控制数码管的显示,PC端发送字符A,数码管显示A,发送其它非法字符时,数码管显示E。 数码管显示格式如下: 备注: 单片机IRC振荡器频率设置为12MHz。 串口通信波特率:…...
DeepSeek V3-0324升级:开启人机共创新纪元
一、技术平权:开源协议重构AI权力格局 DeepSeek V3选择MIT协议开源6850亿参数模型,本质上是一场针对技术垄断的“数字起义”。这一决策的深层影响在于: 商业逻辑的重构 闭源AI公司依赖API收费的商业模式面临根本性挑战。当顶级模型能力可通过…...
探索抓包利器ProxyPin,实现手机APP请求抓包,支持https请求
以下是ProxyPin的简单介绍: - ProxyPin是一个开源免费HTTP(S)流量捕获神器,支持 Windows、Mac、Android、IOS、Linux 全平台系统- 可以使用它来拦截、检查并重写HTTP(S)流量,支持捕获各种应用的网络请求。ProxyPin基于Flutter开发࿰…...
K8S接口请求过程
K8S接口请求过程 1. 宿主机IP (Host IP)2. Service IP3. NodePort4. Pod端口 (Pod Port)5. 容器端口 (Container Port)6. 应用端口 (Application Port)例子:外部流量如何进入应用配置流量路径表详细说明补充说明--连通性测试: 在Kubernetes(k…...
文献学习:单细胞+临床+模型构建 | 一篇Molecular Cancer文献如何完整解读CDK4/6i耐药机制
👋 欢迎关注我的生信学习专栏~ 如果觉得文章有帮助,别忘了点赞、关注、评论! 📌一、研究背景:CDK4/6i 是不是“万无一失”? HR/HER2- 是最常见的乳腺癌亚型,占比超过70%。近年来,随…...
3.26前端模拟面试
包含 Vue 3、TypeScript、性能优化、工程化等方面,偏八股文。 基础知识 Vue 3 响应式原理:Vue 3 如何实现响应式系统?Proxy 和 Reflect 的作用是什么? TypeScript 类型体操:实现一个 TypeScript 类型 DeepPartial&am…...
Python SciPy面试题及参考答案
目录 什么是 SciPy?它与 NumPy 有什么区别? 如何在 Python 中安装 SciPy? 如何导入 SciPy 库? SciPy 中有哪些子模块?简要介绍它们的功能。 如何使用 SciPy 进行数值积分?请举例说明。 SciPy 中提供了哪些求解微分方程的函数? 什么是插值?SciPy 中如何进行插值?…...
数据库——MySQL基础
一、建立数据库 新建 create 删除 drop 修改 alter 数据库 database 数据表 table 建数据表 create table stu( 字段名 类型 [ 约束 ] [ 主键 ] [注释] ); 二、数据类型 数字 整数 tinyint (小型数据)一般用来做状态…...
Jetpack LiveData 使用与原理解析
一、引言 在 Android 开发中,数据的变化需要及时反映到界面上是一个常见的需求。然而,传统的方式可能会导致代码复杂、难以维护,并且容易出现内存泄漏等问题。Jetpack 组件中的 LiveData 为我们提供了一种优雅的解决方案,它是一种…...
HarmonyOS Next~鸿蒙系统开发类Kit深度解析与应用实践
HarmonyOS Next~鸿蒙系统开发类Kit深度解析与应用实践 鸿蒙系统(HarmonyOS)凭借其分布式架构和全场景能力,为开发者提供了丰富的开发类Kit。本文将从安全、网络、基础功能、硬件及调测五大类Kit展开,深入探讨其核心技…...
网盘解析工具更新,解决了一些bug
解析工具v1.2.1版本更新,本次是小版本更新,修复了一些bug。 之前小伙伴反应的网盘进入文件后不能返回上一级,现在这个bug修复了,已经可以点击了。 点击资源后会回到资源那一级目录,操作上是方便了不少。 增加了检查自…...
SQL语句及其应用(上) (DDL语句以及DML语句)
SQL语句的定义: 概述: 全称叫 Structured Query Language, 结构化查询语言, 主要是实现 用户(程序员) 和 数据库软件(例如: MySQL, Oracle)之间交互用的. 分类: DDL: 数据定义语言, 主要是操作 数据库, 数据表, 字段, 进行: 增删改查(CURD) 涉及到的关键字: create, drop, …...
混境之地1
问题描述 小蓝有一天误入了一个混境之地。 好消息是:他误打误撞拿到了一张地图,并从中获取到以下信息: 混境之地的大小为 n⋅mn⋅m,其中 # 表示这个位置很危险,无法通行,. 表示道路,可以通行。他…...
5种生成模型(VAE、GAN、AR、Flow 和 Diffusion)的对比梳理 + 易懂讲解 + 代码实现
目录 1 变分自编码器(VAE) 1.1 概念 1.2 训练损失 1.3 VAE 的实现 2 生成对抗网络(GAN) 2.1 概念 2.2 训练损失 a. 判别器的损失函数 b. 生成器的损失函数 c. 对抗训练的动态过程 2.3 GAN 的实现 3 自回归模型&am…...
doris:查询熔断
查询熔断是一种保护机制,用于防止长时间运行或消耗过多资源的查询对系统产生负面影响。当查询超过预设的资源或时间限制时,熔断机制会自动终止该查询,以避免对系统性能、资源使用以及其他查询造成不利影响。这种机制确保了集群在多用户环境下…...
