Python結(jié)合pywebview打造輕量級桌面應(yīng)用的完整教學(xué)
今天我們來聊聊一個非常輕量且強(qiáng)大的Python庫——pywebview。如果你曾經(jīng)為開發(fā)一個簡單的桌面應(yīng)用而糾結(jié)于Electron的笨重、PyQt的復(fù)雜,或是Tkinter的界面簡陋,那pywebview或許正是你一直在找的解決方案。
一、介紹
pywebview 是一個輕量級的跨平臺Python庫,它允許你在一個原生窗口中嵌入Web技術(shù)(HTML/CSS/JS)來構(gòu)建GUI界面。本質(zhì)上,它就是一個迷你瀏覽器內(nèi)核,讓你可以用寫網(wǎng)頁的方式寫桌面應(yīng)用。
與其他桌面框架對比:
- Electron:功能強(qiáng)大,但打包體積大、內(nèi)存占用高。
- PyQt/Tkinter:原生控件,但界面現(xiàn)代化程度低、開發(fā)效率不高。
- pywebview:輕量、跨平臺、易上手,適合快速開發(fā)中小型桌面應(yīng)用,尤其是已有Web前端的項(xiàng)目。
二、安裝
安裝全量版本
pip install pywebview
安裝指定環(huán)境版本
如果你希望控制依賴版本,可以使用:
pip install pywebview[qt] # 使用Qt后端 pip install pywebview[cef] # 使用CEF后端
三、使用入門
3.1 基本使用
來看一個最簡單的例子:
import webview
def main():
window = webview.create_window('Hello pywebview', 'https://pywebview.flowrl.com')
webview.start()
if __name__ == '__main__':
main()
函數(shù)說明:
create_window():創(chuàng)建窗口,參數(shù)包括標(biāo)題和初始URL或本地HTML路徑。start():啟動GUI事件循環(huán)。

3.2 應(yīng)用程序架構(gòu)
純網(wǎng)絡(luò)服務(wù)架構(gòu)
就如上文的基本使用,前端只需暴露應(yīng)用服務(wù)器,后端調(diào)用即可
import webview
if __name__ == '__main__':
webview.create_window("My App", "http://localhost:3000")
webview.start(http_server=True, port=3000)
無服務(wù)器架構(gòu)
完全不使用網(wǎng)絡(luò)服務(wù)器,通過 webview.create_window(...html='') 或者 window.load_html 加載 HTML。
import webview
html='''
<!DOCTYPE html>
<html>
<body>
<h1>Hello from HTML!</h1>
</body>
</html>
'''
webview.create_window("Local App", html=html)
webview.start()

根據(jù)官網(wǎng)說明:這種方法有一些限制,因?yàn)樵诩虞d的頁面上下文中沒有文件系統(tǒng)。圖片和其他資源只能通過 Base64 內(nèi)聯(lián)加載。
3.3 JS與Python交互
pywebview 支持在JS中調(diào)用Python函數(shù),也支持在Python中調(diào)用JS方法。
下述是JS中調(diào)用Python函數(shù)的代碼示例:
Python端:
import webview
class Api:
def get_message(self):
return "Hello from Python!"
if __name__ == '__main__':
api = Api()
window = webview.create_window('JS 接口 示例', 'index.html', js_api=api)
webview.start()
JS端(在HTML中):
<!DOCTYPE html>
<html>
<body>
<button onClick="greet()">打招呼</button>
</body>
<script>
function greet() {
pywebview.api.get_message().then(function(message) {
alert(message);
});
}
</script>
</html>
推薦將Python邏輯封裝成API,JS中異步調(diào)用,保持前后端分離。
四、應(yīng)用打包
使用 pyinstaller 打包你的應(yīng)用:
pyinstaller --onefile --windowed your_script.py
打包后會生成一個獨(dú)立的可執(zhí)行文件,可在沒有Python環(huán)境的機(jī)器上運(yùn)行。
五、常見使用場景
5.1 文件操作
文件下載
你可以使用Python控制文件下載路徑,或由前端觸發(fā)下載。
import webview
if __name__ == '__main__':
# 創(chuàng)建一個標(biāo)準(zhǔn)的 webview 窗口
webview.settings['ALLOW_DOWNLOADS'] = True
window = webview.create_window('Simple browser', 'https://pywebview.idepy.com/download')
webview.start()
文件拖放
下述是常見的文件拖放效果,實(shí)際上是通過拖放后獲取到文件路徑,進(jìn)而通過文件路徑調(diào)用相關(guān)API再進(jìn)一步操作文件。
import webview
from webview.dom import DOMEventHandler
def on_drag(e):
pass
def on_drop(e):
files = e['dataTransfer']['files']
if len(files) == 0:
return
print(f'事件類型: {e["type"]}。被拖入的文件:')
for file in files:
print(file.get('pywebviewFullPath'))
def bind(window):
window.dom.document.events.dragenter += DOMEventHandler(on_drag, True, True)
window.dom.document.events.dragstart += DOMEventHandler(on_drag, True, True)
window.dom.document.events.dragover += DOMEventHandler(on_drag, True, True, debounce=500)
window.dom.document.events.drop += DOMEventHandler(on_drop, True, True)
if __name__ == '__main__':
window = webview.create_window(
'拖放示例', html='''
<html>
<body style="height: 100vh;"->
<h1>將文件拖放到此處</h1>
</body>
</html>
'''
)
webview.start(bind, window)
5.2 自定義菜單
pywebview 支持自定義系統(tǒng)菜單:
import webview
import webview.menu as wm
def change_active_window_content():
active_window = webview.active_window()
if active_window:
active_window.load_html('<h1>You changed this window!</h1>')
def click_me():
active_window = webview.active_window()
if active_window:
active_window.load_html('<h1>You clicked me!</h1>')
def do_nothing():
pass
def say_this_is_window_2():
active_window = webview.active_window()
if active_window:
active_window.load_html('<h1>This is window 2</h2>')
def open_file_dialog():
active_window = webview.active_window()
active_window.create_file_dialog(webview.SAVE_DIALOG, directory='/', save_filename='test.file')
if __name__ == '__main__':
window_1 = webview.create_window(
'Application Menu Example', 'https://pywebview.idepy.com/hello'
)
window_2 = webview.create_window(
'Another Window', html='<h1>Another window to test application menu</h1>'
)
menu_items = [
wm.Menu(
'Test Menu',
[
wm.MenuAction('Change Active Window Content', change_active_window_content),
wm.MenuSeparator(),
wm.Menu(
'Random',
[
wm.MenuAction('Click Me', click_me),
wm.MenuAction('File Dialog', open_file_dialog),
],
),
],
),
wm.Menu('Nothing Here', [wm.MenuAction('This will do nothing', do_nothing)]),
]
webview.start(menu=menu_items)
你也可以完全用HTML+CSS在前端構(gòu)建菜單,更靈活美觀。
5.3 圖標(biāo)設(shè)置
使用 webview.start(icon=<file_path>) 設(shè)置窗口圖標(biāo)。
import webview
if __name__ == '__main__':
window = webview.create_window('Set window icon', 'https://pywebview.idepy.com/hello')
webview.start(icon='../logo/logo.png')
此方法僅在 GTK 和 QT 平臺上受支持。其他平臺的圖標(biāo)將在凍結(jié)過程中設(shè)置。
六、總結(jié)
pywebview 是一個非常靈活且強(qiáng)大的工具,尤其適合:
- 已有Web前端,想快速封裝成桌面應(yīng)用;
- 希望用HTML/CSS/JS構(gòu)建現(xiàn)代化界面;
- 對應(yīng)用體積和內(nèi)存占用有要求的場景;
- 需要跨平臺運(yùn)行(Windows/macOS/Linux)。
它的學(xué)習(xí)曲線平緩,社區(qū)活躍,文檔完善,是Python開發(fā)者進(jìn)軍桌面應(yīng)用開發(fā)的絕佳選擇。
如果你正在尋找一個輕量、高效、易擴(kuò)展的桌面開發(fā)方案,不妨試試 pywebview,相信它會給你帶來驚喜。
技術(shù)選型沒有絕對的好壞,只有適合與否。pywebview 在我多個中小項(xiàng)目中表現(xiàn)出色,尤其是在快速原型和內(nèi)部工具開發(fā)中。希望這篇指南能幫你少走彎路,早日打造出屬于自己的桌面應(yīng)用!
以上就是Python結(jié)合pywebview打造輕量級桌面應(yīng)用的完整教學(xué)的詳細(xì)內(nèi)容,更多關(guān)于Python pywebview桌面應(yīng)用開發(fā)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中使用 unittest.TestCase單元測試的用例詳解
python 在unittest.TestCase 中提高了很多斷言方法,這篇文章主要介紹了python中使用 unittest.TestCase 進(jìn)行單元測試的操作方法,需要的朋友可以參考下2021-08-08
pycharm配置Anaconda虛擬環(huán)境全過程
這篇文章主要介紹了pycharm配置Anaconda虛擬環(huán)境全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Python?threading和Thread模塊及線程的實(shí)現(xiàn)
這篇文章主要介紹了Python?threading和Thread模塊及線程的實(shí)現(xiàn),Python通過兩個標(biāo)準(zhǔn)庫thread和threading提供對線程的支持,threading對thread進(jìn)行了封裝,具體實(shí)現(xiàn)介紹需要的朋友可以參考一下下面文章內(nèi)容2022-06-06
零基礎(chǔ)上手使用Python?pdfplumber提取原生PDF表格
pdfplumber是基于PDFMiner.six構(gòu)建的PDF解析庫,它不僅能提取文本,還可以將數(shù)據(jù)完整準(zhǔn)確地提取出來,本文將從零開始,帶你系統(tǒng)掌握pdfplumber的表格提取功能并附完整可運(yùn)行代碼和可視化調(diào)試技巧2026-04-04

