使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C stm32f10x LED亮

#include<stm32f10x.h>int main(){#if 0 //APIOA 时钟初始化unsigned int * p(unsigned int*)0x40021018;*p | 0x1<<2;//A0 推挽输出p(unsigned int*)0x40010800;*p *p & ~0xf | 0x1;//A0低电平p(unsigned int*)0x4001080c;*p & ~0x1;#endifRCC->APB2E…

redux ,react-redux,redux-toolkit 简单总结

Redux、React-Redux 和 Redux Toolkit 是协同工作的三个库&#xff0c;各自承担不同角色&#xff0c;相互协同。 Redux&#xff1a;基础底座 底层状态管理库&#xff0c;负责状态存储、Action 派发和 Reducer 执行 ​React-Redux&#xff1a;连接 React 组件与 Redux Store 通…

智能制造:物联网和自动化之间的关系

工业自动化 工业自动化是机器设备或生产过程在不需要人工直接干预的情况下按预期的目标实现测量、操纵等信息处理和过程控制的统称。 在传统的工业生产过程中&#xff0c;很多环节需要人工操作&#xff0c;比如设备调试、生产监控、质量检测等。然而&#xff0c;随着工业自动化…

“自动驾驶背后的数学” 专栏导读

专栏链接&#xff1a; 自动驾驶背后的数学 专栏以“自动驾驶背后的数学”为主题&#xff0c;从基础到深入&#xff0c;再到实际应用和未来展望&#xff0c;全面解析自动驾驶技术中的数学原理。开篇用基础数学工具搭建自动驾驶的整体框架&#xff0c;吸引儿童培养兴趣&#xff0…

集成学习(下):Stacking集成方法

一、Stacking的元学习革命 1.1 概念 Stacking&#xff08;堆叠法&#xff09; 是一种集成学习技术&#xff0c;通过组合多个基学习器&#xff08;base learner&#xff09;的预测结果&#xff0c;并利用一个元模型&#xff08;meta-model&#xff09;进行二次训练&#xff0c…

Dubbo 全面解析:从 RPC 核心到服务治理实践

一、分布式系统与 RPC 框架概述 在当今互联网时代&#xff0c;随着业务规模的不断扩大&#xff0c;单体架构已经无法满足高并发、高可用的需求&#xff0c;分布式系统架构成为主流选择。而在分布式系统中&#xff0c;远程服务调用&#xff08;Remote Procedure Call&#xff0…

vmware虚拟机突然连不上网

1.一般是自己的主机把服务给关掉了&#xff0c;右击我的电脑&#xff0c;然后找到管理->服务&#xff0c;确保下面虚拟机的网络服务是否打开 Vmware虚拟机突然连接不上网络【方案集合】_vmware虚拟机连不上网-CSDN博客 2.识别到无效网络 控制面板->网络和共享中心&…

Selenium之简介

Selenium简介 首先&#xff0c;让我们看看官网是怎么定义的 Selenium是一个支持web浏览器自动化的一系列工具和库的综合项目&#xff0c;提供了扩展来模拟用户和浏览器的交互&#xff0c;用于扩展浏览器分配的分发服务器&#xff1b;用于W3C WebDriver规范的基础架构 其实&a…

SpringBoot 开发入门—Springboot基础框架汇总

一、环境准备 Java&#xff1a;Spring Boot 3.0.2 需要 Java 17&#xff0c;并且与 Java 19 兼容 Maven&#xff1a;Apache Maven 3.5 或更高版本兼容 二、启动器 以下应用程序启动器由 Spring Boot 在该组下提供&#xff1a;org.springframework.boot 表 1.Spring 引导应…

前端批量导入方式

webpack批量导入 webpack中使用 require.context 实现自动导入 const files require.context(./modules, false, /\.ts$/); const modules {}; files.keys().forEach((key) > {if (key ./index.ts) { return; }modules[key.replace(/(\.\/|\.ts)/g, )] files(key).def…

阿里巴巴1688类网站高保真原型设计

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1688类B2B平台原型</title><script src…

C++设计模式-装饰模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、装饰模式基本介绍 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;允许你在不改变对象自身的基础上&#xff0c;动态地给一个对象添加额外的职责。这种模式创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法签…

2、学习Docker前置操作

docker三件套&#xff1a;镜像、容器、仓库 Docker hubhub.docker.com ubuntu安装【待更新】 CentOS安装 CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 (64-bit)上&#xff0c;要求系统为 64 位、Linux 系统内核版本为 3.8 以上&#xff0c;这里选用 Cen…

70. Linux驱动开发与裸机开发区别,字符设备驱动开发

一、裸机驱动开发回顾 1、底层&#xff0c;跟寄存器打交道&#xff0c;有些MCU提供了库。 二、Linux驱动开发思维 1、Linux下驱动开发直接操作寄存器不现实。 2、根据Linux下的各种驱动框架进行开发。一定要满足框架&#xff0c;也就是Linux下各种驱动框架的掌握。 3、驱动最…

【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程

0 前言 0-1 Screeps: World 众所不周知&#xff0c;​Screeps: World是一款面向编程爱好者的开源大型多人在线即时战略&#xff08;MMORTS&#xff09;沙盒游戏&#xff0c;其核心机制是通过编写JavaScript代码来控制游戏中的单位&#xff08;称为“Creep”&#xff09;&#…

第12章:优化并发_《C++性能优化指南》notes

优化并发 一、并发基础与优化核心知识点二、关键代码示例与测试三、关键优化策略总结四、性能测试方法论多选题设计题答案与详解多选题答案&#xff1a; 设计题答案示例 一、并发基础与优化核心知识点 线程 vs 异步任务 核心区别&#xff1a;std::thread直接管理线程&#xf…

[C++面试] RAII资源获取即初始化(重点)

一、入门 1、什么是 RAII&#xff1f; RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是 C 的核心编程范式&#xff0c;核心思想是 ​将资源的生命周期与对象的生命周期绑定&#xff1a; ​资源获取&#xff1a;在对象构造…

Unity粒子系统

目录 一、界面参数介绍1.主模块2.Emission 模块3.Shape 模块4.Velocity over Lifetime 模块5.Noise 模块6.Limit Velocity Over Lifetime 模块7.Inherit Velocity 模块8.Force Over Lifetime 模块9.Color Over Lifetime 模块10.Color By Speed 模块11.Size over Lifetime 模块1…

Docker-清理容器空间prune

docker system prune -a 是一个非常有用的命令&#xff0c;用于清理 Docker 系统中未使用的资源&#xff0c;包括停止的容器、未使用的网络、卷以及未被任何容器引用的镜像&#xff08;悬空镜像和所有未使用的镜像&#xff09;。以下是关于该命令的详细说明&#xff1a; 命令格…

LabVIEW远程控制通讯接口

abVIEW提供了多种远程控制与通讯接口&#xff0c;适用于不同场景下的设备交互、数据传输和系统集成。这些接口涵盖从基础的网络协议&#xff08;如TCP/IP、UDP&#xff09;到专用技术&#xff08;如DataSocket、远程面板&#xff09;&#xff0c;以及工业标准协议&#xff08;如…