python的pywebview庫結合Flask和waitress開發桌面應用程序簡介

pywebview的用途與特點

用途
pywebview是一個輕量級Python庫,用于創建桌面應用程序(GUI)。它通過嵌入Web瀏覽器組件(如Windows的Edge/IE、macOS的WebKit、Linux的GTK WebKit),允許開發者使用HTML/CSS/JavaScript構建界面,并用Python處理后端邏輯。這種方式結合了Web技術的靈活性和Python的強大功能,適合快速開發跨平臺桌面應用。

特點

  1. 跨平臺支持:原生支持Windows、macOS、Linux,無需額外配置。
  2. 輕量級:無需完整的瀏覽器,僅依賴系統內置Web組件。
  3. 雙向通信:HTML前端與Python后端可互相調用函數。
  4. 簡單易用:API簡潔,學習成本低。
  5. 資源占用少:相比Electron等框架,內存占用更小。

基本使用方法

1. 安裝
pip install pywebview
2. 簡單示例(Python與HTML交互)
import webviewdef print_message(message):print(f"收到前端消息: {message}")# 創建一個HTML字符串作為界面
html = """
<!DOCTYPE html>
<html>
<head><title>PyWebView示例</title>
</head>
<body><button onclick="python.print_message('你好,Python!')">發送消息到Python</button><script>// 調用Python函數window.python = pywebview.api;</script>
</body>
</html>
"""# 創建窗口并加載HTML
window = webview.create_window("PyWebView應用", html=html)
webview.start(gui=None, debug=True)  # gui=None自動選擇系統默認瀏覽器引擎

結合Flask與waitress開發應用

架構設計
  • Flask:提供Web API,處理業務邏輯。
  • pywebview:作為桌面應用的外殼,加載Flask的Web界面。
  • waitress:在生產環境中替代Flask內置服務器,提供更好的性能。
開發環境代碼示例
# app.py - Flask后端
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')
def index():return """<!DOCTYPE html><html><head><title>Flask + PyWebView應用</title></head><body><h1>Hello from Flask!</h1><button onclick="fetchData()">獲取數據</button><div id="result"></div><script>async function fetchData() {const response = await fetch('/api/data');const data = await response.json();document.getElementById('result').textContent = data.message;}</script></body></html>"""@app.route('/api/data')
def get_data():return jsonify({"message": "這是來自Flask后端的數據!"})if __name__ == '__main__':# 開發環境:使用Flask內置服務器app.run(debug=True, port=5000)
# desktop.py - PyWebView桌面應用包裝
import webview
import threading
import subprocessdef run_flask():# 啟動Flask應用(開發環境)subprocess.run(['python', 'app.py'])if __name__ == '__main__':# 在后臺線程中啟動Flaskflask_thread = threading.Thread(target=run_flask, daemon=True)flask_thread.start()# 創建PyWebView窗口,加載Flask應用window = webview.create_window("桌面應用", "http://localhost:5000")webview.start(gui=None, debug=True)

生產環境配置(使用waitress)

1. 修改Flask應用(app.py)
# app.py - Flask后端(生產環境)
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')
def index():return """<!-- 同上,HTML內容 -->"""@app.route('/api/data')
def get_data():return jsonify({"message": "這是來自Flask后端的數據!"})# 移除開發環境的app.run(),改為導出app實例
2. 使用waitress啟動Flask
# server.py - 使用waitress啟動Flask(生產環境)
from waitress import serve
from app import appif __name__ == '__main__':serve(app, host='127.0.0.1', port=5000, threads=8)  # 生產環境使用waitress
3. 修改PyWebView應用(desktop.py)
# desktop.py - PyWebView桌面應用(生產環境)
import webview
import threading
import subprocessdef run_flask():# 啟動Flask應用(生產環境使用waitress)subprocess.run(['python', 'server.py'])if __name__ == '__main__':# 在后臺線程中啟動Flaskflask_thread = threading.Thread(target=run_flask, daemon=True)flask_thread.start()# 創建PyWebView窗口,加載Flask應用window = webview.create_window("桌面應用", "http://localhost:5000")webview.start(gui=None, debug=False)  # 生產環境關閉調試模式

打包應用的建議

為了將應用分發給最終用戶,可以使用PyInstallercx_Freeze將Python代碼打包成單個可執行文件:

# 使用PyInstaller打包
pyinstaller --onefile --windowed desktop.py

注意事項

  • 打包時需確保包含所有依賴項(如Flask、waitress、pywebview)。
  • 在macOS/Linux上可能需要額外配置以確保WebView組件正確加載。

總結

通過結合pywebviewFlaskwaitress,可以開發出兼具美觀界面和強大功能的跨平臺桌面應用:

  • 開發階段:使用Flask內置服務器和調試模式,提高開發效率。
  • 生產階段:使用waitress替代Flask服務器,提升性能和穩定性。
  • 部署階段:使用PyInstaller打包為獨立可執行文件,方便分發。

完整代碼

以下是在Windows平臺上結合PyWebView、Flask和Waitress的完整代碼實現。代碼分為三個主要文件,分別負責Flask后端、桌面應用包裝和生產環境啟動。

1. Flask后端代碼(app.py)

# app.py - Flask后端應用
from flask import Flask, jsonify, render_template_string
import osapp = Flask(__name__)# 確保中文正常顯示
app.config['JSON_AS_ASCII'] = False# 首頁路由
@app.route('/')
def index():return render_template_string("""<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>PyWebView + Flask應用</title><style>body { font-family: 'Microsoft YaHei', sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }.container { background-color: #f9f9f9; border-radius: 8px; padding: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }h1 { color: #333; }button { background-color: #4CAF50; color: white; border: none; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 4px; }#result { margin-top: 20px; padding: 10px; background-color: #e8f5e9; border-radius: 4px; }</style></head><body><div class="container"><h1>PyWebView + Flask桌面應用</h1><p>這是一個基于Web技術的跨平臺桌面應用示例。</p><button onclick="fetchData()">獲取數據</button><button onclick="callPythonFunction()">調用Python函數</button><div id="result">點擊按鈕查看結果...</div><script>// 從Python后端獲取數據async function fetchData() {try {const response = await fetch('/api/data');if (!response.ok) throw new Error('網絡響應失敗');const data = await response.json();document.getElementById('result').textContent = data.message;} catch (error) {document.getElementById('result').textContent = '錯誤: ' + error.message;}}// 調用Python函數(通過PyWebView的API)async function callPythonFunction() {try {// 確保PyWebView API已加載if (window.pywebview && window.pywebview.api) {const result = await window.pywebview.api.multiply_numbers(5, 3);document.getElementById('result').textContent = `Python計算結果: 5 × 3 = ${result}`;} else {document.getElementById('result').textContent = 'PyWebView API未加載';}} catch (error) {document.getElementById('result').textContent = '調用Python函數時出錯: ' + error.message;}}</script></div></body></html>""")# API路由 - 返回JSON數據
@app.route('/api/data')
def get_data():return jsonify({"message": "這是來自Flask后端的數據!","timestamp": str(os.times()),"platform": "Windows桌面應用"})# 導出Flask應用實例供其他模塊使用
if __name__ == '__main__':# 僅在直接運行此文件時使用Flask內置服務器(開發環境)app.run(debug=True, port=5000)

2. 開發環境啟動腳本(desktop_dev.py)

# desktop_dev.py - 開發環境下的桌面應用啟動腳本
import webview
import threading
import subprocess
import time
import sys
from flask import Flaskdef run_flask():"""在子進程中啟動Flask開發服務器"""# 確定Python可執行文件路徑python_exe = sys.executable# 啟動Flask應用server = subprocess.Popen([python_exe, 'app.py'],stdout=subprocess.PIPE,stderr=subprocess.STDOUT,universal_newlines=True)# 等待服務器啟動for line in server.stdout:print(line.strip())if 'Running on' in line:breakreturn serverclass Api:"""供前端JavaScript調用的Python API"""def multiply_numbers(self, a, b):"""示例函數:計算兩個數的乘積"""return a * bif __name__ == '__main__':# 啟動Flask服務器flask_server = run_flask()try:# 創建API實例api = Api()# 創建PyWebView窗口window = webview.create_window(title="PyWebView桌面應用",url="http://localhost:5000",width=800,height=600,resizable=True,fullscreen=False,js_api=api  # 暴露Python API給JavaScript)# 啟動PyWebView主循環webview.start(debug=True)finally:# 關閉Flask服務器if flask_server:flask_server.terminate()flask_server.wait()print("Flask服務器已關閉")

3. 生產環境啟動腳本(desktop_prod.py)

# desktop_prod.py - 生產環境下的桌面應用啟動腳本
import webview
import threading
import subprocess
import time
import sys
from waitress import serve
from app import appclass Api:"""供前端JavaScript調用的Python API"""def multiply_numbers(self, a, b):"""示例函數:計算兩個數的乘積"""return a * bdef run_waitress():"""使用waitress啟動Flask應用(生產環境)"""print("正在啟動Waitress服務器...")serve(app, host='127.0.0.1', port=5000, threads=8)if __name__ == '__main__':# 在后臺線程中啟動waitress服務器server_thread = threading.Thread(target=run_waitress, daemon=True)server_thread.start()# 等待服務器啟動(給服務器一些時間初始化)print("等待服務器啟動...")time.sleep(2)try:# 創建API實例api = Api()# 創建PyWebView窗口window = webview.create_window(title="PyWebView桌面應用",url="http://localhost:5000",width=800,height=600,resizable=True,fullscreen=False,js_api=api  # 暴露Python API給JavaScript)# 啟動PyWebView主循環(關閉調試模式)webview.start(debug=False)except Exception as e:print(f"應用啟動失敗: {e}")finally:print("應用已關閉")

4. 運行說明

開發環境
  1. 安裝依賴:

    pip install flask pywebview waitress
    
  2. 運行開發環境腳本:

    python desktop_dev.py
    
    • 會自動啟動Flask開發服務器和PyWebView窗口。
    • 修改代碼后刷新頁面即可看到變化。
生產環境
  1. 打包應用(可選):

    pyinstaller --onefile --windowed desktop_prod.py
    
  2. 直接運行生產環境腳本:

    python desktop_prod.py
    
    • 使用waitress服務器替代Flask內置服務器,性能更好。
    • 關閉了調試模式,更安全穩定。

功能說明

  • 前后端交互

    • 前端通過fetch調用Flask API(如/api/data)。
    • 前端通過window.pywebview.api調用Python函數(如multiply_numbers)。
  • 界面特點

    • 使用Tailwind CSS風格的界面(內聯樣式確保打包時不丟失)。
    • 支持中文顯示(使用Microsoft YaHei字體)。
    • 響應式設計,適配不同屏幕尺寸。

這個實現可以作為Windows桌面應用的基礎框架,你可以根據需要擴展Flask API或修改前端界面。

另一個應用示例代碼

# create Desktop App by  pywebview
"""
Replace the flask module with waitress module.
To avoid the warning: WARNING: This is a development server. Do not use it in a production deployment. 
Use a production WSGI server instead.
"""import webview
from flask import Flask, render_template_string
import threading
from waitress import serve# Create a Flask application
app = Flask(__name__)# Define the route
@app.route('/')
def index():return render_template_string("""<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><title>Pywebview + Flask 示例</title></head><body><h1>歡迎使用 Pywebview 和 Flask 構建的桌面應用!</h1><a href="http://cnliutz.ipyingshe.net">Blog Site</a>                        </body></html>""")def create_webview():# Define the URL of the Flask application to loadurl = "http://127.0.0.1:5000"# Create a window and load the specified URLwindow = webview.create_window('Pywebview + Flask 應用', url)# Run the applicationwebview.start()if __name__ == '__main__':# Start the Waitress server in a separate threaddef run_waitress():try:# Start Waitress to run the Flask applicationserve(app, host='127.0.0.1', port=5000)except Exception as e:print(f"Error starting Waitress: {e}")waitress_thread = threading.Thread(target=run_waitress)waitress_thread.daemon = Truewaitress_thread.start()# Start pywebviewcreate_webview()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915401.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#通過HslCommunication連接西門子PLC1200,并防止數據跳動的通用方法

textEdit30.Text ReadValue<int>(() > plc.ReadInt32("DB57.DBD16"), ref _last_num).ToString();// 通用讀取方法&#xff08;支持所有值類型&#xff09;private T ReadValue<T>(Func<OperateResult<T>> readFunc, ref T lastValue) w…

Linux切換到Jenkins用戶解決Jenkins Host key verification failed

以root或sudo user身份, 切換到jenkins用戶 su -s /bin/bash jenkins前往jenkins的home目錄 cd /var/lib/jenkins/查看.ssh下是否已經有known_hosts, 有的話, 是什么內容, 正常情況下, 這時候是沒有對應IP記錄的 cd .ssh/ more known_hosts訪問一下對應IP, 記錄公鑰 ssh 192.16…

7.17 Java基礎 | 集合框架(下)

接上文&#xff1a; 7.16 Java基礎 | 集合框架&#xff08;上&#xff09;-CSDN博客 【1】Map集合 Map 集合是一種能存儲鍵值對的數據結構。它的主要功能是依據鍵&#xff08;Key&#xff09;來快速查找對應的值&#xff08;Value&#xff09; 1、聲明 Map<Integer,Integer…

【LeetCode刷題指南】--反轉鏈表,鏈表的中間結點,合并兩個有序鏈表

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

ubuntu上面的wps2019格式很亂在復制粘貼的時候

問題&#xff1a;在復制內容到 Ubuntu 上的 WPS 2019 出現如下問題&#xff1a;列表符號、換行和縮進錯亂&#xff0c;表現為每行前的點符號&#xff08;?&#xff09;變成不規則對齊或空格間距不統一。原因分析? 主要原因是&#xff1a;WPS 2019 在 Ubuntu 上的兼容性較差&a…

bws-rs:Rust 編寫的 S3 協議網關框架,支持靈活后端接入

bws-rs&#xff1a;Rust 編寫的 S3 協議網關框架&#xff0c;支持靈活后端接入 bws-rs介紹 bws-rs 是一個用 Rust 編寫的輕量級 S3 協議服務端網關框架&#xff0c;旨在幫助開發者快速構建兼容 AWS S3 協議 的對象存儲服務。該框架支持 S3 V4 簽名校驗&#xff0c;集成 Axum 作…

黑馬點評系列問題之p70postman報錯“服務器異常”

問題描述&#xff1a;在做這個位置的時候報錯報錯如下控制臺報錯如下解決根據控制臺的報錯來看&#xff0c;是?Redis模板未注入導致的空指針異常經過排查&#xff0c;原因是這里少了個Resource

Docker搭建Elasticsearch和Kibana

1.安裝docker&#xff0c;確保正常啟動 2.按步驟操作&#xff0c;這里的es是單節點的&#xff0c;如需多節點&#xff0c;需安裝docker-compose進行yml文件的編寫對容器進行編排 #docker拉鏡像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.11.2 docker pul…

【深度學習筆記 Ⅰ】3 step by step (jupyter)

1. 導包 import numpy as np import h5py import matplotlib.pyplot as plt from testCases_v2 import * from dnn_utils_v2 import sigmoid, sigmoid_backward, relu, relu_backward% matplotlib inline plt.rcParams[figure.figsize] (5.0, 4.0) # set default size of plo…

前端流式渲染流式SSR詳解

以下是關于前端流式渲染及流式SSR&#xff08;Server-Side Rendering&#xff09;的詳細解析&#xff0c;結合核心原理、技術實現、優化策略及實際應用場景展開說明&#xff1a;?? 一、流式渲染基礎原理 核心概念 ? 流式渲染&#xff1a;數據通過分塊傳輸&#xff08;Chunke…

Redis通用常見命令(含面試題)

核心命令get 根據key取valueset 把key和vlaue存入進去key和value本事上都是字符串&#xff0c;但在操作的時候可以不用加上引號""Redis作為鍵值對的結構&#xff0c;key固定就是字符串&#xff0c;value實際上會有多種類型&#xff08;字符串哈希表&#xff0c;列表&…

react/vue vite ts項目中,自動引入路由文件、 import.meta.glob動態引入路由 無需手動引入

utils/autoRouteHelper.ts // src/utils/autoRouteHelper.ts import { lazy } from "react"; import withLoading from "/components/router/withLoading";/** 自動生成某個文件夾下的子路由 */ interface RouteItem {path: string;element?: any;childre…

Linux簡單了解歷史

一、引言Linux是計算機經久不衰的一個計算機操作系統&#xff0c;在那個unix、蘋果macOS、微軟Window神仙打架的年代拼出自己的一席之地。最初的Linux完全就是一個unix的一個翻版&#xff0c;并且最開始的版本(0.01)就是一個差不多一萬行簡單到不能再簡單的版本。那現在Linux是…

lua(xlua)基礎知識點記錄二

1. 關于lua函數傳參參數在lua中給function傳遞參數的時候一般分為兩種情況&#xff1a;值傳遞和引用傳遞值傳遞&#xff1a;值傳遞&#xff1a;數字、字符串、布爾值、nil等基本類型通過值傳遞。函數內部接收的是外部變量的副本&#xff0c;修改副本不會影響原始變量。 雖然我們…

分治算法---歸并

1、排序數組 class Solution {vector<int> tmp; public:vector<int> sortArray(vector<int>& nums) {tmp.resize(nums.size());mergeSort(nums,0,nums.size() - 1);return nums;}void mergeSort(vector<int>& nums, int left , int right){if…

《計算機網絡》實驗報告三 UDP協議分析

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 3.1 DNS查詢UDP數據分析 3.2 QQ通信UDP數據分析 4、實驗結果與分析 4.1 DNS查詢UDP數據分析 4.2 QQ通信UDP數據分析 4.3 根據捕獲的數據包&#xff0c;分析UDP的報文結構&#xff0c;將UDP協議中個字段名&#xff0c;字段…

Mysql 學習總結(90)—— Mysql 8.0 25 條性能優化實戰指南

1. 內存配置優化 # my.cnf 關鍵內存參數 innodb_buffer_pool_size = 8G # 建議設置為物理內存的70-80% innodb_log_buffer_size = 64M # 日志緩沖區大小 query_cache_size = 0 # MySQL 8.0已移除,確保關閉 tmp_table_size = 256M # 臨時表大小 max_…

嵌入式通信DQ單總線協議及UART(一)

文章目錄一、DS18B20--DQ單總線1.1 單總線時序結構分析1.1.1 初始化&#xff1a;1.1.2 發送一位1.1.3 接收一位1.1.5 發送字節1.1.6 操作流程1.1.7 數據幀的理解1.1.8 數據幀的理解二、UART2.1 同步通信和異步通信2.2 雙工通信2.3 串行通信常用數據校驗方式2.3.1 奇偶檢驗2.3.2…

2025年SEVC SCI2區,利用增強粒子群算法(MR-MPSO)優化MapReduce效率和降低復雜性,深度解析+性能實測

目錄1.摘要2.MapReduce-Modified Particle Swarm Optimization (MR-MPSO)3.結果展示4.參考文獻5.算法輔導應用定制讀者交流1.摘要 大數據的迅猛增長帶來了嚴峻的數據管理挑戰&#xff0c;尤其是在數據分布不均的龐大數據庫中。由于這種不匹配&#xff0c;傳統軟件系統的效率大…

10-day07文本分類

文本分類使用場景文本分類任務 文本分類-機器學習貝葉斯算法應用在NLP中的應用 用貝葉斯公式處理文本分類任務 一個合理假設&#xff1a; 文本屬于哪個類別&#xff0c;與文本中包含哪些詞相關 任務&#xff1a; 知道文本中有哪些詞&#xff0c;預測文本屬于某類別的概率 貝葉斯…