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;预测文本属于某类别的概率 贝叶斯…