pywebview (flowrl.com) 是圍繞 webview 組件的輕量型跨平臺包裝器(wrapper),它允許在其自己的本機 GUI 窗口中顯示 HTML 內(nèi)容。它使您可以在桌面應用程序中使用 Web 技術讲坎,同時盡最大可能隱藏使用瀏覽器構建GUI的事實腺怯。您可以將 pywebview
與輕量級的 Web 框架(例如 Flask 或 Bottle)一起使用,也可以單獨使用 Python 和 DOM 之間的雙向橋梁眠副。
pywebview 允許您使用 HTML,CSS和 Javascript 為 Python 程序構建GUI, 將 pywebview 視為適用于 Python 的輕量級Electron霜旧。與 Electron 不同,pywebview 不捆綁 Web 渲染器儡率,而是依賴于操作系統(tǒng)提供的渲染挂据。旁注:捆綁渲染器仍然是一種選擇以清,例如 CEF。
pywebview
使用本機 GUI 創(chuàng)建 Web 組件窗口:Windows 上的 WinForms崎逃,macOS 上的 Cocoa 和 Linux 上的 QT 或 GTK掷倔。如果選擇凍結應用程序,則 pywebview
不會捆綁繁重的 GUI 工具箱或 Web 渲染器个绍,從而使可執(zhí)行文件的更小勒葱。pywebview
與 Python 3 兼容。
安裝:
pip install pywebview
Hello world:
import webview
webview.create_window('Hello world', 'https://pywebview.flowrl.com/hello')
webview.start()
顯示:
create_window
函數(shù)返回一個窗口實例巴柿,該實例提供許多 window 操作和與 DOM 相關的功能凛虽。
Explore pywebview further by reading documentation, examples or contributing. If React is your thing, get started right away with React boilerplate.
您可以根據(jù)需要創(chuàng)建任意多個窗口。GUI loop 啟動后創(chuàng)建的 Windows 將會立即顯示篮洁。所有打開的窗口都作為列表存儲在 webview.windows
中涩维。窗口按創(chuàng)建順序存儲。
create_window
的第二個參數(shù) url
可以指向遠程或本地路徑袁波。另外瓦阐,您可以通過設置 html
參數(shù)來加載HTML。
import webview
webview.create_window('Woah dude!', html='<h1>Woah dude!<h1>')
webview.start()
請注意篷牌,如果同時設置了 url
和 html
睡蟋,則 html
優(yōu)先。
pywebview
提供了多個 Web 渲染器的選擇枷颊。要更改 Web 渲染器戳杀,請將 start
函數(shù)的 gui
參數(shù)設置為所需的值(例如 cef
或 qt
)。有關詳細信息夭苗,請參見 Renderer信卡。
HTTP server
pywebview
提供了與 WSGI 兼容的 HTTP 服務器。要啟動 HTTP 服務器题造,請將url
設置為本地入口點(無 protocol模式)傍菇,并將start
函數(shù)的http_server
參數(shù)設置為True
。
import webview
webview.create_window('Woah dude!', 'index.html')
webview.start(http_server=True)
如果希望將外部 WSGI 兼容的 HTTP 服務器與 pywebview
一起使用界赔,則可以將服務器對象作為 URL 傳遞丢习,即。在這種情況下淮悼,無需設置 http_server
參數(shù)咐低。
from flask import Flask
import webview
server = Flask(__name__, static_folder='./assets', template_folder='./templates')
webview.create_window('Flask example', server)
webview.start()
Threading model
webview.start
啟動 GUI 循環(huán),并且是一項阻塞功能袜腥。由于 GUI 循環(huán)受阻见擦,您必須在單獨的線程或進程中執(zhí)行后端邏輯。您可以手動啟動線程或進程。另外鲤屡,您可以通過將函數(shù)作為要啟動的第一個參數(shù) func
來執(zhí)行代碼儡湾。第二個參數(shù)設置函數(shù)的參數(shù)。這種方法在后臺啟動線程执俩,與手動啟動線程相同徐钠。
import webview
def custom_logic(window):
window.toggle_fullscreen()
window.evaluate_js('alert("Nice one brother")')
window = webview.create_window('Woah dude!', html='<h1>Woah dude!<h1>')
webview.start(custom_logic, window)
# anything below this line will be executed after program is finished executing
pass
Make Python and Javascript talk with each other
您可以將自定義邏輯視為與 HTML/JS 領域中的 前端代碼進行通信的后端。現(xiàn)在役首,您將如何使二者互相交流尝丐?pywebview
提供了兩種方式的 JS-Python 橋接器,使您既可以通過 Python(通過 valuate_js
)執(zhí)行Javascript衡奥,也可以通過 Javascript(通過 js_api
和 expose
)執(zhí)行 Python 代碼爹袁。細節(jié)見:interdomain commmunication。另一種方法是在自定義邏輯中運行Python Web服務器(例如 Flask 或 Bottle)矮固,并使前端代碼對它進行API調(diào)用失息。那將與典型的Web應用程序相同。例如档址,此方法適用于將現(xiàn)有的Web應用程序移植到桌面應用程序盹兢。有關這兩種方法的更多信息,請參見 Architecture守伸。
檢索 DOM 節(jié)點
現(xiàn)在绎秒,您可以使用 window.get_elements(selector)
函數(shù)檢索DOM節(jié)點。節(jié)點使用 domJSON 庫進行序列化尼摹。Example