最终我还是学会了Vue 和 Electron
- Vue 是纯前端的,通常跑在浏览器里,大家习惯了"Vue = 网页"。
- Electron 自带一套主进程模型,很多人用原生 HTML + JS 写 Electron,没用过 Vue。
之后再补一下详细步骤吧
方案一:本地 Web 服务模式(最简单,适合纯 HTML+JS)
这种方案的核心是:Python 启动一个本地微型服务器(如 Flask/FastAPI),同时托管 HTML 静态文件,最后打包成一个 exe。用户双击 exe 后,程序会在后台启动服务,并自动打开默认浏览器访问本地页面。
- 优点:开发简单,完全保留你现有的 HTML/JS 代码,无需修改前端逻辑。
- 缺点:会弹出系统默认浏览器,且地址栏会显示
http://127.0.0.1:xxxx,看起来不太像传统的桌面软件。 - 实现步骤:
在 Python 代码中,使用框架挂载 HTML 目录。例如使用 FastAPI:
python编辑
from fastapi import FastAPI from fastapi.staticfiles import StaticFiles import uvicorn app = FastAPI() # 将当前目录下的 'web' 文件夹作为静态资源挂载 app.mount("/", StaticFiles(directory="web", html=True), name="static") if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=8000)使用 PyInstaller 打包。在命令行执行:
bash编辑
pip install pyinstaller # --add-data "源路径;目标路径" (Windows下用分号,Mac/Linux用冒号) pyinstaller --onefile --add-data "web;web" main.py打包后,生成的
dist/main.exe即可直接运行。
方案二:原生桌面窗口模式(推荐,体验最好)
如果你希望程序运行后弹出一个没有地址栏、菜单栏的独立窗口(看起来像真正的单机软件),强烈推荐使用PyWebView或Eel库。它们能调用系统自带的 WebView 组件(Windows 上是 Edge/IE 内核)来渲染你的 HTML。
- 优点:界面专业,无浏览器地址栏,支持 Python 与 JS 双向通信(JS 可以直接调用 Python 函数)。
- 实现步骤(以 PyWebView 为例):
安装依赖:
pip install pywebview修改 Python 启动代码:
python编辑
import webview # 直接加载本地 HTML 文件 webview.create_window('我的单机应用', 'web/index.html') webview.start()同样使用 PyInstaller 打包:
bash编辑
pyinstaller --onefile --windowed main.py
注:
--windowed参数可以隐藏后台的黑框控制台窗口。
方案三:专业 Electron 混合模式(适合复杂前端工程)
如果你的前端是基于 Vue、React 等现代框架构建的,且需要极强的界面交互体验,可以采用Electron + Python的方案。
- 优点:界面极其华丽,跨平台兼容性最好(VS Code、Discord 都是这么做的)。
- 缺点:打包体积较大(通常 100MB 起步),配置相对复杂。
- 核心逻辑:Electron 作为主进程负责显示界面,同时通过
child_process在后台静默启动你的 Python 脚本作为后端 API 服务。
💡 打包时的核心注意事项
无论你选择哪种方案,在将 Python 和 HTML 打包成单机版时,都需要解决以下两个关键问题:
资源路径问题(最容易踩坑):
python
在开发时,我们读取文件通常用相对路径(如./web/index.html)。但 PyInstaller 打包成单文件 exe 后,程序运行时会把资源解压到一个临时的系统文件夹中。
解决方案:在 Python 代码中加入以下兼容函数来获取正确的绝对路径:编辑
import sys import os def resource_path(relative_path): """获取打包后资源的绝对路径""" if hasattr(sys, '_MEIPASS'): # PyInstaller 打包后的临时目录 return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) # 使用时: # html_path = resource_path("web/index.html")依赖环境缺失:
打包后的 exe 虽然自带了 Python 解释器,但如果你的 Python 代码调用了系统级的 DLL(比如某些图像处理库),在别人的电脑上可能会报错。
解决方案:通常需要在目标电脑上安装Microsoft Visual C++ Redistributable运行库(这是 Windows 运行很多软件的必备组件)。
建议:如果你的前端只是普通的 HTML+JS,优先尝试方案二(PyWebView),它既能保证单机软件的质感,又能让你继续发挥 Python 处理后端逻辑的优势。
需要我按方案二(PyWebView)给你出一份完整的、可直接运行的代码框架吗?包含 Python 后端、HTML 前端调用和打包配置。
参考 - 无厘头 Python
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x99 in position 32: invalid start byte
Python 读文件错误: invalid start byte / illegal multibyte sequence_leader_ww的博客-CSDN博客
UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 32: illegal multibyte sequence
rawBytes = str(vsrefl.rawBytes, 'gbk')无厘S 头,和 history 历史相关单词
- source/sɔːs/n. 史料,来源(historical source 史料)
- scholar/ˈskɒlə(r)/n. 学者,史学研究者
- scholarship/ˈskɒləʃɪp/n. 学术;史学研究
- sequence/ˈsiːkwəns/n. 次序,时序;事件先后顺序(历史时序)
- succession/səkˈseʃn/n. 继承,继任;连续(succession of kings 王位承袭)
- sovereign/ˈsɒvrɪn/n./adj. 君主;主权的(历史君主)
- statue/ˈstætʃuː/n. 雕像(历史纪念雕像)
- stele/ˈstiːli/n. 石碑,碑刻(古代历史铭文碑)
- settlement/ˈsetlmənt/n. 定居点,聚落(史前 / 古代聚居遗址)
- survive/səˈvaɪv/v. 留存,幸存;survivaln. 遗存(历史文物遗存)
- synchronic/sɪŋˈkrɒnɪk/adj. 共时的(史学 / 语言学,同一时代)
- scribe/skraɪb/n. 抄写员,文书(古代史官、抄书人)
- scroll/skrəʊl/n. 卷轴,古卷(历史文献卷轴)
- sanction/ˈsæŋkʃn/n. 法令,批准(古代法令)
- siege/siːdʒ/n. 围城,围攻(历史战役)