首頁 > 軟體

Python使用pywebview開發桌面應用的全過程

2022-06-26 14:04:07

前言

之前用過Eel做的桌面應用覺得已經夠屌了,不過由於Eel是呼叫Chrome,時常出現各種小問題,比如視窗大小設定後有時候不管用,滑鼠右鍵選單無法禁用(一眼就能看出來是個web).而且嘗試了用pyinstaller打包後檔案好大,昨天晚上閒逛又發現了個比Eel更好的解決方案pywebview,更輕量,可自定義的設定更多. 由於pywebview是直接呼叫系統自身的瀏覽器(Win10呼叫Edge,Win7呼叫IE),因此很適合打包釋出. 官網:pywebview.flowrl.com/

最簡單應用上手

先裝上輪子

pip install pywebview

實現一個內嵌百度首頁的winform程式,固定視窗大小,禁止選擇文字

"""
main.py
"""
import webview

window = webview.create_window(
    title='百度一下,全是廣告',
    url='http://www.baidu.com',
    width=850,
    height=600,
    resizable=False,    # 固定視窗大小
    text_select=False,   # 禁止選擇文字內容
    confirm_close=True   # 關閉時提示
)
webview.start()

無論是啟動速度,還是顯示效果都要比Eel好很多. 退出提示的視窗預設顯示的是英文,可以在地化一下,定義個字典傳給webview.start()當啟動引數就行了.

chinese = {
    'global.quitConfirmation': u'確定關閉?',
}
webview.start(localization=chinese)

高階應用

在HTML前端介面中呼叫Python中的函數

Http是由Flask提供的,直接將Flask範例化物件app傳給url引數就行了

import webview
from flask import Flask, render_template

# 範例化flask物件
app = Flask(__name__)

# 定義路由渲染模板
@app.route('/')
def index():
    return render_template('/index.html')

# 設定pywebview關閉提示的中文翻譯
chinese = {
    'global.quitConfirmation': u'確定關閉?',
}

# 傳給前端的api物件, 定義了一個可以通過js呼叫退出當前應用的函數
class Api:
    def __init__(self) -> None:
        self._window = None

    def set_window(self, window):
        self._window = window

    def quit(self):
        self._window.destroy()


if __name__ == '__main__':
	# 範例化Api類
    api = Api()
    window = webview.create_window(
        title='我是一個標題',
        url=app,
        fullscreen=True,	# 以全螢幕模式啟動
        # width=760,	# 自定義視窗大小
        # height=390,
        # resizable=False,  # 固定視窗大小
        text_select=False,  # 禁止選擇文字內容
        confirm_close=True,  # 關閉時提示
        js_api=api  # 將上面範例化後的Api物件傳給前端js呼叫
    )
    # --劃重點--務必記得需要將上面建立的window物件再通過函數傳給範例化後的api物件
    api.set_window(window)
    # 啟動程式
    webview.start(localization=chinese)

前端寫一個id為exit的button, jquery給它繫結個點選的事件來呼叫api函數方法, 注意這裡的pywebview.api是在pywebview的應用啟動後自動注入到當前瀏覽器視窗中的全域性物件, python中寫的函數就係結在它下面.

$("#exit").click(function () {
	pywebview.api.quit();
})

打包成單個EXE檔案

之前用pyinstaller手工打包太麻煩了, 發現個圖形化的設定pyinstaller進行打包的工具: auto-py-to-exe, 用pip裝一下, 然後就可以直接啟動了

pip install auto-py-to-exe
# 啟動工具
auto-py-to-exe

這工具居然是用eel寫的, 哈哈...

推薦使用單目錄方式進行打包, 單檔案的話可能會對程式程式碼中涉及到路徑參照的地方出現問題, 坑有點大, 不推薦使用.

需要注意的是要在附加檔案一塊設定中將flask涉及到的模板, 靜態檔案, 還有其他諸如sqlite資料庫檔案都新增進去

判斷頁面中pywebview.api物件是否載入成功

今天又寫了個小應用,呼叫的原生的html檔案,想要在頁面開啟的時候直接呼叫pywebview.api中關聯的python函數,但是由於頁面中直接用js存取pywebview.api物件的話會報錯找不到物件,又翻了下官方檔案,發現需要給window物件新增個事件監聽pywebviewready,範例程式碼:

<script>
  window.addEventListener('pywebviewready', function () {
    pywebview.api.hl('aaa').then(function (res) {
      document.querySelector('#hl').textContent = res.rate
    })
  })
</script>

總結

到此這篇關於Python使用pywebview開發桌面應用的文章就介紹到這了,更多相關Python pywebview桌面應用開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com