aardio + Python 視覺化快速開發桌面程式,一鍵生成獨立 EXE

2022-09-26 18:02:24

網路上大家分享的 aardio + Python 混合開發的文章很多,不得不說 aardio 與 Python 混合開發是真的簡單 !

 快速入門

推薦幾個快速上手教學:
《 aardio + Python 開發桌面軟體快速入門 》
《 aardio 快速入門 - 語法速覽 》

在 aardio 中可直接建立 Python 工程:

 

aardio 視覺化開發圖形介面非常方便,相關的教學、開源專案都很多,這裡就不多說了。

至於 aardio + Python 互調也非常簡單,範例:

import console;
import py3; 

//匯入 Python 模組。
var itertools = py3.import("itertools")

//呼叫 Python 函數,支援純 aardio 型別引數
var permutations = itertools.permutations({"a","b","c"});

//呼叫 Python 內建函數 list
var pyList = py3.list(permutations);

//遍歷 Python 物件成員
for( item in pyList.each() ){
  console.log(item); //像 aardio 物件一樣使用 Python 物件
}

console.pause();

aardio 自帶的 Python 範例也非常多,請開啟「 aardio 範例 > 呼叫其他語言 > Python 」 檢視。

 一鍵成獨立 EXE 檔案

純 aardio 程式可以方便地生成獨立 EXE 檔案,不需要虛擬化,不需要釋放臨時檔案 —— 這是因為 aardio 自帶的檔案函數都自動相容了 EXE 內嵌資源路徑。 即使用到了一些第三方的 DLL 元件一般也可以自記憶體載入,即使是 .NET 程式集也可以方便地自記憶體載入。

但是 Python 不能這樣搞,aardio + Python 生成的軟體就必須帶上 Python 直譯器,*.py 檔案一般也是放在硬碟上。

下面是我用 aardio + Python 範例工程生成 EXE 得到的檔案:

 

上面的 PyApp.exe 需要帶上 /lib/ , /py/ 這幾個目錄才能執行。當然,這裡面已經自帶了綠色的 Python 執行時,使用者電腦不再需要安裝 Python 。

但是很多使用者喜歡小輕快的獨立 EXE 檔案。我經常被問到這個問題,怎樣將 aardio + Python 開發的軟體轉換為獨立 EXE。

其實用免費的虛擬化封包工具( 不需要額外釋放臨時檔案 )  Enigma Virtual Box 就可以將上面的幾個檔案轉換為獨立 EXE 檔案。我基於 Enigma Virtual Box 寫了一個擴充套件庫 process.vb ,可以一鍵完成所有操作。

新版 aardio 生成 EXE 後多了一個「轉換為獨立 EXE」按鈕。

 

點選「轉換為獨立 EXE」以後生成了新的 PyApp.exe 。然後我們可以刪掉其他的 /lib/, /py/ 目錄,因為 PyApp.exe  不再需要這些目錄了(已經封包到 PyApp.exe  內部了)。

 包含了 Python 執行時的  PyApp.exe 體積為 19MB,打個壓縮包其實只有 7 MB,這個體積相比 Electron 什麼的算是非常小了。

 process.vb 擴充套件庫

Enigma Virtual Box 的主程式並沒有提供程式設計介面,也不支援命令列引數。但提供了一個命令列工具 enigmavbconsole,可以傳入 Enigma Virtual Box 生成的工程檔案(*.evb)路徑並生成獨立 EXE 檔案。

而 evb 工程檔案實際上是一個 XML 檔案。
Enigma Virtual Box 介面上如果拖入包含中文的路徑,生成的 evb 會出現亂碼。但實際上 evb 支援 Unicode / UTF-8 編碼,如果我們用程式生成 evb 檔案,並存為 UTF-8 編碼,enigmavbconsole 是可以正常處理的。 但如果在 Enigma Virtual Box 介面上再次開啟這個 evb 檔案,介面上又亂碼了。

這個 evb 的內容其實也有些複雜,但好在 aardio 寫程式速度快,要不了幾句程式碼這個 process.evb 擴充套件庫就寫好了。

來個簡單的呼叫例子:

import console; 
import process.evb.project;
import ide;

//建立封包工程
var evbProject = process.evb.project()

//設定啟動 EXE
evbProject.main = ide.getPublishPath();

//設定要生成的獨立 EXE
evbProject.output = io.tmpname(,".dat");

//新增釋出目錄下的所有檔案
evbProject.addSubFile(ide.getPublisDir());

//生成工程
evbProject.generate("/app.evb");
 
//生成獨立 EXE
import process.evb;
var evb = process.evb("/app.evb")
evb.logResponse();
 
//清理臨時檔案
io.remove("/app.evb"); 
fsys.move(evbProject.output,ide.getPublishPath());

既然都玩到這個份上來,再隨手拖個介面吧: