熱線電話:13121318867

登錄
首頁精彩閱讀Python小技之不用 GUI,照樣實現圖形界面
Python小技之不用 GUI,照樣實現圖形界面
2022-01-25
收藏

作者:李曉飛

來源:Python 技術

如果說程序員有什么怕的,那我想可能就是 —— 需求又變了!

這不,客戶在筆者開發完一個基于瀏覽器的 Web 應用程序之后說:程序需要在內(無)部(網)環境中運行……

這就意味著無法安裝 Python 環境!

誰叫咱是程序員呢,不就開發一個 GUI 版本嗎,難不倒我……

可是聽到給的時間后,就不淡定了……

為了不影響客戶的評測,只能給出一周時間!

構思

GUI 雖然也不難,不過需要梳理一遍服務以及與用戶的交互接口,弄不好就得為 GUI 單獨編寫接口,這點時間顯然不夠呀。

不行,就再想想辦法……

不然直接將 Web 應用包裝成一個可執行程序,拷貝到機器上就能運行,而且類似的框架很多,比如 Nodejs 中的 Electron[1],Python 中的 Pywebview[2]。

只要將原來的 Web 程序包裝一下就好了,那么說干就干!

神器出場

Web 程序是用 Flask 開發的,所以需要安裝 Python 的 Pywebview 作為打包工具。

建立虛擬環境[3] 或者在原來的 Web 項目環境中,執行:

pip install pywebview

在 Windows 系統中,需要 .Net 4.0 以上

小試牛刀:

import webview window = webview.create_window('Hello!', 'http://http://www.justdopython.com')
webview.start()
  • 引用 webview 庫
  • 啟動一個窗口,設置標題為 Hello!,指定頁面地址
  • 啟動 webview

就能看到如下的效果:

Python小技之不用 GUI,照樣實現圖形界面

小試牛刀

神奇吧!

Pywebview 支持三種模式,簡單模式,服務器模式 和 線程模式。

簡單模式 就相當于一個定制流瀏覽器,指定一個地址,就可以實現瀏覽了,如上面的例子。

服務器模式 相當于包裝了一個 Web 應用,就是會啟動一個本地服務器,在定制的瀏覽器中瀏覽。

線程模式 比較高級,就是需要自己手動維護線程狀態,實現更高級的玩法。

對于現在的需求,我們選擇服務器模式,即包裝本地的一個 Web 應用。

對接 Flask

服務器模式會為我們提供一個 HTTP Server,只要把 Web 應用部署上去就好了。

因為無非展示實際項目的代碼,這里寫一個簡單的 Flask 應用:

關于 Flask Web 應用開發,可以參考筆者之前寫的 Flask 文章

創建一個 app.py 文件:

from flask import Flask, render_template, jsonify, request

app = Flask(__name__) # 創建一個應用 @app.route('/')  def index(): # 定義根目錄處理器 return render_template('index.html') @app.route('/detail') def detail(): return render_template('detail.html') if __name__ == '__main__':
    app.run() # 啟動服務 

這個應用很簡單,只有兩個頁面,分別通過 / 和 /detail 來訪問。

如果運營這段代碼,就會啟動一個 Flask 應用,通過 http://120.0.0.1:5000 來訪問。

如何套在 Pywebview 中呢?

很簡單:

import webview from app import app if __name__ == '__main__': window = webview.create_window('Pywebview', app, height=600, width=1000)
    webview.start()
  • 引入 webview
  • 引入 剛才創建的 app
  • 創建一個 webview window,并將 app 作為 url 參數傳入
  • 然后啟動 webview 就可以了

這里的關鍵是,將 Flask 應用作為 url 參數,Webview 發現傳入的參數是 flask 應用,就會啟動服務模式。

運行程序后,可以看到和在瀏覽器中的效果一樣的:

Python小技之不用 GUI,照樣實現圖形界面

對接 Flask

目錄問題

現在就可以將這個項目打包成 exe 了。

首先需要安裝 pyinstaller[4]

pip install pyinstaller

然后進入程序目錄執行:

pyinstall -F -w main.py 
  • F 參數表示將程序打包成一個可執行文件,不加這個參數就會打包成一個文件夾夾
  • w 參數表示執行打包好的可執行程序時,不顯示命令行窗口,這個特性只有在 Windows 系統中有

很快在程序目錄下,就會生成一個 dist 文件夾,其中就會有個 main.exe 可執行文件,這就是打包好的結果。

雙擊運行,可以看到效果……

等等,好像并不是想象中的那樣!

Python小技之不用 GUI,照樣實現圖形界面

對接 Flask

這是怎么回事呢?

根據提示來看,是因為找不到頁面的模板文件。

我們在前面創建 Flask app 時,使用的是默認的模板路徑,即 app.py 文件所在目錄的 templates 目錄,為啥打包之后就找不見了呢?

這是因為在 windows 中,可執行文件的運行時,會被解壓到一個特定的目錄下,而我們的模板文件并沒有被打包進入 exe 文件中,所以導致運行時找不見模板文件。

完美呈現

如何解決這個問題呢?

作為不使用外部數據或文件的程序,只需要將程序本身打包就可以了,但大部分程序都需要外部數據,比如我們的 Flask 應用,就需要用到靜態文件等。

那么如何將它們打包進可執行文件呢?

只需要在打包時多加一個參數就可以了:

pyinstaller main.py -F -w --add-data "./templates/*;templates" 

-- add-data 參數表示添加額外的數據 -- ./templates/* 表示需要添加當前目錄的 templates 目錄中的所有文件 -- ;為分隔符,其后的 templates 表示解壓是這些數據所在的目錄,這個目錄名必須和 創建 app 時 template_folder 參數一致 -- 如果需要用到靜態文件,需要額外添加,比如 --add-data "./static/*;static"

這樣就能將外部數據一起打包進來了。

打包好后,雙擊執行,就會發現網頁得以完美呈現了。

注意:

如果使用了虛擬環境,必須在虛擬環境中單獨安裝 pyinstaller,而不能用其他環境中已經安裝好的,這是為了包裝打包是可以鏈接所以程序引用的模塊

因為 pyinstaller 打包時,找不到被引用的模塊時并不報錯,而打包好的程序可能會無法執行。

總結

經過一番折騰,終于在客戶要求的時間之前將工作完成了,特別高興。

回頭一想,多虧用了 Python 作為主要的開發語言,因為 Python 強悍的社區支持沒有找不到的解決方法。

這次經歷的另一個啟示就是,遇到問題,不要著急就做,可以先想一想,是否有更好的方法,特別在使用 Python 的時候。

Python小技之不用 GUI,照樣實現圖形界面

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢