Python使用pywebview開發(fā)桌面應(yīng)用的全過(guò)程
前言
之前用過(guò)Eel做的桌面應(yīng)用覺(jué)得已經(jīng)夠?qū)帕?不過(guò)由于Eel是調(diào)用Chrome,時(shí)常出現(xiàn)各種小問(wèn)題,比如窗口大小設(shè)置后有時(shí)候不管用,鼠標(biāo)右鍵菜單無(wú)法禁用(一眼就能看出來(lái)是個(gè)web).而且嘗試了用pyinstaller打包后文件好大,昨天晚上閑逛又發(fā)現(xiàn)了個(gè)比Eel更好的解決方案pywebview
,更輕量,可自定義的設(shè)置更多. 由于pywebview
是直接調(diào)用系統(tǒng)自身的瀏覽器(Win10調(diào)用Edge,Win7調(diào)用IE),因此很適合打包發(fā)布. 官網(wǎng):pywebview.flowrl.com/
最簡(jiǎn)單應(yīng)用上手
先裝上輪子
pip install pywebview
實(shí)現(xiàn)一個(gè)內(nèi)嵌百度首頁(yè)的winform
程序,固定窗口大小,禁止選擇文字
""" main.py """ import webview window = webview.create_window( title='百度一下,全是廣告', url='http://www.baidu.com', width=850, height=600, resizable=False, # 固定窗口大小 text_select=False, # 禁止選擇文字內(nèi)容 confirm_close=True # 關(guān)閉時(shí)提示 ) webview.start()
無(wú)論是啟動(dòng)速度,還是顯示效果都要比Eel好很多. 退出提示的窗口默認(rèn)顯示的是英文,可以本地化一下,定義個(gè)字典傳給webview.start()
當(dāng)啟動(dòng)參數(shù)就行了.
chinese = { 'global.quitConfirmation': u'確定關(guān)閉?', } webview.start(localization=chinese)
高階應(yīng)用
在HTML前端界面中調(diào)用Python中的函數(shù)
Http是由Flask提供的,直接將Flask實(shí)例化對(duì)象app傳給url
參數(shù)就行了
import webview from flask import Flask, render_template # 實(shí)例化flask對(duì)象 app = Flask(__name__) # 定義路由渲染模板 @app.route('/') def index(): return render_template('/index.html') # 配置pywebview關(guān)閉提示的中文翻譯 chinese = { 'global.quitConfirmation': u'確定關(guān)閉?', } # 傳給前端的api對(duì)象, 定義了一個(gè)可以通過(guò)js調(diào)用退出當(dāng)前應(yīng)用的函數(shù) 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__': # 實(shí)例化Api類 api = Api() window = webview.create_window( title='我是一個(gè)標(biāo)題', url=app, fullscreen=True, # 以全屏模式啟動(dòng) # width=760, # 自定義窗口大小 # height=390, # resizable=False, # 固定窗口大小 text_select=False, # 禁止選擇文字內(nèi)容 confirm_close=True, # 關(guān)閉時(shí)提示 js_api=api # 將上面實(shí)例化后的Api對(duì)象傳給前端js調(diào)用 ) # --劃重點(diǎn)--務(wù)必記得需要將上面創(chuàng)建的window對(duì)象再通過(guò)函數(shù)傳給實(shí)例化后的api對(duì)象 api.set_window(window) # 啟動(dòng)程序 webview.start(localization=chinese)
前端寫一個(gè)id為exit
的button, jquery給它綁定個(gè)點(diǎn)擊的事件來(lái)調(diào)用api函數(shù)方法, 注意這里的pywebview.api
是在pywebview的應(yīng)用啟動(dòng)后自動(dòng)注入到當(dāng)前瀏覽器窗口中的全局對(duì)象, python中寫的函數(shù)就綁定在它下面.
$("#exit").click(function () { pywebview.api.quit(); })
打包成單個(gè)EXE文件
之前用pyinstaller
手工打包太麻煩了, 發(fā)現(xiàn)個(gè)圖形化的配置pyinstaller進(jìn)行打包的工具: auto-py-to-exe
, 用pip裝一下, 然后就可以直接啟動(dòng)了
pip install auto-py-to-exe # 啟動(dòng)工具 auto-py-to-exe
這工具居然是用
eel
寫的, 哈哈...
推薦使用單目錄方式進(jìn)行打包, 單文件的話可能會(huì)對(duì)程序代碼中涉及到路徑引用的地方出現(xiàn)問(wèn)題, 坑有點(diǎn)大, 不推薦使用.
需要注意的是要在附加文件一塊設(shè)置中將flask涉及到的模板, 靜態(tài)文件, 還有其他諸如sqlite數(shù)據(jù)庫(kù)文件都添加進(jìn)去
判斷頁(yè)面中pywebview.api對(duì)象是否加載成功
今天又寫了個(gè)小應(yīng)用,調(diào)用的本地的html文件,想要在頁(yè)面打開的時(shí)候直接調(diào)用pywebview.api
中關(guān)聯(lián)的python函數(shù),但是由于頁(yè)面中直接用js訪問(wèn)pywebview.api
對(duì)象的話會(huì)報(bào)錯(cuò)找不到對(duì)象,又翻了下官方文檔,發(fā)現(xiàn)需要給window
對(duì)象添加個(gè)事件監(jiān)聽pywebviewready
,示例代碼:
<script> window.addEventListener('pywebviewready', function () { pywebview.api.hl('aaa').then(function (res) { document.querySelector('#hl').textContent = res.rate }) }) </script>
總結(jié)
到此這篇關(guān)于Python使用pywebview開發(fā)桌面應(yīng)用的文章就介紹到這了,更多相關(guān)Python pywebview桌面應(yīng)用開發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm中連接mysql數(shù)據(jù)庫(kù)的步驟詳解
在進(jìn)行Python研發(fā)的時(shí)候,pycharm是一個(gè)很好的IDE,下面這篇文章主要給大家介紹了pycharm中連接mysql數(shù)據(jù)庫(kù)的步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05Python的Flask開發(fā)框架簡(jiǎn)單上手筆記
這篇文章主要介紹了Python的Flask開發(fā)框架的入門知識(shí)整理,Flask是一款極輕的Python web開發(fā)框架,需要的朋友可以參考下2015-11-11Python使用pyautocad+openpyxl處理cad文件示例
這篇文章主要介紹了Python使用pyautocad+openpyxl處理cad文件,結(jié)合實(shí)例形式分析了Python使用pyautocad與openpyxl模塊讀寫cad文件相關(guān)應(yīng)用操作技巧,需要的朋友可以參考下2019-07-07Python定義一個(gè)跨越多行的字符串的多種方法小結(jié)
今天小編就為大家分享一篇Python定義一個(gè)跨越多行的字符串的多種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07