使用vscode搭建pywebview集成vue項(xiàng)目實(shí)踐
本節(jié)我們使用pywebview和vue3搭建一個(gè)簡(jiǎn)單的桌面應(yīng)用示例。
環(huán)境準(zhǔn)備
- 1、工具:VSCode
- 2、環(huán)境:python、pywebview、vue3+typesrcipt+vite
- 3、前端UI:Element Plus
項(xiàng)目源碼下載
- Gitee源碼地址:https://gitee.com/lqh4188/pywebview-vue
項(xiàng)目說(shuō)明
1 目錄結(jié)構(gòu)
├── dist #python構(gòu)建后的可執(zhí)行程序目錄 ├── python #后臺(tái)python文件 ├── web #前端vue文件 ├── webdist #前端構(gòu)建后的文件目錄 ├── README.md #項(xiàng)目說(shuō)明 └── main.py Python主入口文件
- 界面示例

- 代碼結(jié)構(gòu)

2 前端項(xiàng)目
前端使用vue3+typescript+vite+elment plus
- 依賴安裝
pnpm i
- 運(yùn)行
pnpm dev
- 構(gòu)建
pnpm build
3 后端項(xiàng)目
后端使用python提供接口服務(wù)
獲取python安裝包(選擇對(duì)應(yīng)版本及系統(tǒng))
- 下載地址: https://www.python.org/downloads/
- 查看本地版本號(hào):
python -V - 安裝pywebview
pip install pywebview
- 運(yùn)行應(yīng)用
#使用pnpm支持 #pnpm dev:py #使用python命令運(yùn)行 python main.py
調(diào)試與生成可執(zhí)行文件
1 本地調(diào)試
- 啟動(dòng)前端項(xiàng)目:
pnpm dev - 啟動(dòng)pywebview:
pnpm dev:py或者直接使用python命令python main.py
2 打包應(yīng)用
- 首頁(yè)進(jìn)行前端項(xiàng)目打包:
pnpm build - 構(gòu)建python可執(zhí)行文件:
pnpm build:py,或直接使用pyinstaller命令生成
#pnpm build:py # 本地集成合體包 pyinstaller --onefile --add-data "webdist;dist" --icon "webdist/favicon.ico" --windowed main.py
參數(shù)說(shuō)明:
- –add-data “webdist;dist”:將前端靜態(tài)資源添加到程序目錄
- –icon “webdist/favicon.ico”:添加自定義圖標(biāo)
- 其他參數(shù)參考pyinstaller參數(shù)說(shuō)明
核心代碼說(shuō)明
代碼參考:PywebviewVue
1、package.json
封裝了前后端項(xiàng)目開(kāi)發(fā)、構(gòu)建的快捷命令:
- 前端項(xiàng)目啟動(dòng):
pnpm dev - 前端項(xiàng)目構(gòu)建:
pnpm build - 啟動(dòng)后端項(xiàng)目:
pnpm dev:py,其實(shí)運(yùn)行的是python main.py - 打包成exe可執(zhí)行文件:
pnpm build:py,其實(shí)執(zhí)行的是
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設(shè)置
由于前端項(xiàng)目默認(rèn)構(gòu)建地址為當(dāng)前目錄下的dist文件,而pywebview也是基于主文件的當(dāng)前目錄,默認(rèn)構(gòu)建后的文件輸出為dits目錄,所以為了構(gòu)建文件,把前端構(gòu)建文件的輸出目錄調(diào)整為和web、python平級(jí)的webdist目錄
- vite.config.ts
build:{
// 構(gòu)建輸出目錄,相對(duì)于 root 目錄
outDir: '../webdist',
}- tsconfig.json
設(shè)置前端項(xiàng)目的入口文件和
{
"compilerOptions": {
"target": "ES5", // 目標(biāo)js的版本
"baseUrl": ".",
"outDir": "./webdist",
"rootDir": "./web/src",
"paths": {
"@/*": ["web/src/*"]
},
},
}3、main.py后端入口文件說(shuō)明
**注意事項(xiàng)**
- python 與 vue的交互
通過(guò)pywebview提供的js_api實(shí)現(xiàn)vue與python的接口交互,這里需要注意的是api與window對(duì)象的掛載
def create_window():
api = jsApi.Api() # 實(shí)例化 Api 類
window = webview.create_window(
title="pywebview vue", # 窗口標(biāo)題
url=html_file_path, # 加載的 URL
min_size=(1000, 600), # 最小尺寸
js_api=api, # 將上面實(shí)例化后的 Api 對(duì)象傳給前端 js 調(diào)用
)
# --劃重點(diǎn)--務(wù)必記得需要將上面創(chuàng)建的 window 對(duì)象再通過(guò)函數(shù)傳給實(shí)例化后的 api 對(duì)象
api.set_window(window)
webview.start(localization=chinese)- 開(kāi)發(fā)環(huán)境與構(gòu)建環(huán)境的目錄設(shè)置
為方便調(diào)試,開(kāi)發(fā)環(huán)境要設(shè)置的前端本地地址,而打包時(shí)可執(zhí)行的exe文件要目錄為dist目錄,所以要區(qū)分根路徑,否則運(yùn)行main.py時(shí),會(huì)報(bào)資源找不到
if getattr(sys, "frozen", False):
# 如果是打包后的可執(zhí)行文件
base_path = sys._MEIPASS
# 定義 Vue 構(gòu)建后的 HTML 文件路徑
html_file_path = os.path.join(base_path, "dist", "index.html")
else:
# 如果是開(kāi)發(fā)環(huán)境
base_path = os.path.dirname(os.path.abspath(__file__))
# 定義 Vue 構(gòu)建后的 HTML 文件路徑
html_file_path = os.path.join(base_path, "http://localhost:5173")- 完整的main.py代碼如下:
import webview
import sys
import os
if getattr(sys, "frozen", False):
# 如果是打包后的可執(zhí)行文件
base_path = sys._MEIPASS
# 定義 Vue 構(gòu)建后的 HTML 文件路徑
html_file_path = os.path.join(base_path, "dist", "index.html")
else:
# 如果是開(kāi)發(fā)環(huán)境
base_path = os.path.dirname(os.path.abspath(__file__))
# 定義 Vue 構(gòu)建后的 HTML 文件路徑
html_file_path = os.path.join(base_path, "http://localhost:5173")
# 定義測(cè)試對(duì)象
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()
# 接收前端提交的數(shù)據(jù)
def saveMessage(self, data):
return f"python接收到數(shù)據(jù): {data}"
# 配置 pywebview 關(guān)閉提示的中文翻譯
chinese = {
"global.quitConfirmation": "確定關(guān)閉?",
}
def create_window():
api = jsApi.Api() # 實(shí)例化 Api 類
window = webview.create_window(
title="pywebview vue", # 窗口標(biāo)題
url=html_file_path, # 加載的 URL
min_size=(1000, 600), # 最小尺寸
js_api=api, # 將上面實(shí)例化后的 Api 對(duì)象傳給前端 js 調(diào)用
)
# --劃重點(diǎn)--務(wù)必記得需要將上面創(chuàng)建的 window 對(duì)象再通過(guò)函數(shù)傳給實(shí)例化后的 api 對(duì)象
api.set_window(window)
webview.start(localization=chinese)
if __name__ == "__main__":
create_window()參考文檔:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?GUI布局工具Tkinter入門(mén)之旅
這篇文章主要為大家介紹了Python?GUI布局工具Tkinter的基礎(chǔ),Tkinter?作為?Python?的標(biāo)準(zhǔn)庫(kù),是非常流行的?Python?GUI?工具,同時(shí)也是非常容易學(xué)習(xí)的,今天我們就來(lái)開(kāi)啟?Tkinter的入門(mén)之旅2022-08-08
wxpython 最小化到托盤(pán)與歡迎圖片的實(shí)現(xiàn)方法
這篇文章主要分享一個(gè)python實(shí)例代碼,使用wxpython實(shí)現(xiàn)最小化到托盤(pán)與歡迎圖片,需要的朋友可以參考下2014-06-06
pandas 按照特定順序輸出的實(shí)現(xiàn)代碼
這篇文章主要介紹了pandas 按照特定順序輸出的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Transpose 數(shù)組行列轉(zhuǎn)置的限制方式
今天小編就為大家分享一篇Transpose 數(shù)組行列轉(zhuǎn)置的限制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python如何實(shí)現(xiàn)API的調(diào)用詳解
Web?API是網(wǎng)站的一部分,用于與使用非常具體的URL請(qǐng)求特定信息的程序交互,下面這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)API的快速調(diào)用指南,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
django ListView的使用 ListView中獲取url中的參數(shù)值方式
這篇文章主要介紹了django ListView的使用 ListView中獲取url中的參數(shù)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Python實(shí)現(xiàn)拉格朗日插值法的示例詳解
插值法是一種數(shù)學(xué)方法,用于在已知數(shù)據(jù)點(diǎn)(離散數(shù)據(jù))之間插入數(shù)據(jù),以生成連續(xù)的函數(shù)曲線,而格朗日插值法是一種多項(xiàng)式插值法。本文就來(lái)用Python實(shí)現(xiàn)拉格朗日插值法,希望對(duì)大家有所幫助2023-02-02

