雖然命令列介面(CLI)用起來已經十分方便,但非軟體開發相關的使用者大多還是習慣使用圖形化的視窗介面來操作軟體。這篇文章將會粗略地介紹Rust生態圈的幾個比較多人使用圖形化介面的框架,接著會著重於最多人使用且跨平台的GTK+進行講解。



Rust的圖形使用者介面(GUI)

當我們在crates.io上以「gui」作為關鍵字來搜尋時,會搜尋到許多GUI的相關套件。對於剛接觸Rust圖形介面的程式設計者,可能會一時之間不知道該選用哪個套件。在此筆者會把比較多人用的套件做簡單的整理和介紹。

gtk

「gtk」是Rust生態圈中最多人選用來開發圖形使用者介面介面的套件,目的是要讓Rust程式語言也可以使用GTK+(3)來開發圖形化介面。GTK+是Unix-like作業系統開發圖形化介面的主流工具,是GNU計劃的一部份,集合了許多GNU的工具和函式庫。GTK+除了能夠運行在Unix-like作業系統之外,也可以跨到非Unix-like的平台(例如Windows)。

Crates.io

Cargo.toml

gtk = "*"

GUI畫面看起來如下圖:

rust-gtk

conrod

「conrod」是基於「Piston」這個同樣由Rust程式語言開發出來的遊戲引擎所製作的圖形介面套件,主打「立即回應的介面」(Reactive and Immediate API)。由於它基於遊戲引擎,所以它是在同一個主迴圈底下完成圖形介面上的元件繪畫與事件控制的,而並非像一般的GUI框架那樣,以物件實體區分不同的圖形元件後,再分開處理。「conrod」與「gtk」套件一樣,都可以跨平台使用。

Crates.io

Cargo.toml

conrod = "*"

GUI畫面看起來如下圖:

rust-gtk

iui

「iui」是基於「libui」的套件。在不同平台下,能夠使用該平台原生的圖形介面函式庫來完成圖形介面的繪製,因此無需修改程式就可以讓程式擁有該平台原生的圖形風格。

Crates.io

Cargo.toml

iui = "*"

GUI畫面看起來如下圖(圖片來自libui的原始碼專案):

rust-gtk

rust-gtk

rust-gtk

Rust與GTK+

要在Rust程式中使用GTK+來開發圖形介面的話,除了引用「gtk」套件外,還必須先在開發環境中安裝相關的系統套件。

基於Debian的Linux作業系統,可以在終端機下執行以下指令:

sudo apt install libgtk-3-dev

紅帽系的Linux作業系統,可以在終端機下執行以下指令:

sudo dnf install gtk3-devel glib2-devel

Apple的MacOS,可以在終端機下執行以下指令:

brew install gtk+3

至於Windows作業系統,會比較麻煩一點,請先參考這篇文章來安裝「MSYS2」,然後再參考這篇文章在「MSYS2」中建立Rust開發環境。

然後用以下指令安裝GTK+的套件:

pacman -S mingw-w64-x86_64-gtk3

rust-gtk

rust-gtk

安裝後就可以在Windows作業系統上用Rust開發GTK+的GUI程式了。先編譯範例專案來執行看看吧!如果您的「MSYS2」沒有裝「unzip」的話,可以使用以下指令先安裝一下:

pacman -S unzip

rust-gtk

用以下指令從範例專案的GitHub取得範例專案的原始碼的ZIP壓縮包:

wget -c https://github.com/gtk-rs/examples/archive/master.zip

rust-gtk

用以下指令解壓縮:

unzip master.zip

rust-gtk

接著將工作目錄移動到範例專案的根目錄,指令如下:

cd examples-master

rust-gtk

執行「cargo build」指令來編譯專案。

rust-gtk

rust-gtk

rust-gtk

rust-gtk

成功編譯之後,可以直接用Windows的檔案瀏覽器瀏覽範例專案下的「target/debug」,會看到很多執行檔。

rust-gtk

嘗試執行「basic.exe」,卻很可能會出現找不到DLL的錯誤,而導致程式無法正常執行。

rust-gtk

但如果是在MSYS2的環境中執行「basic.exe」,卻很正常。

rust-gtk

這是因為Rust編譯出來的GTK+圖形介面程式,必須要跟GTK+相關的函式庫做動態連結,也就是Windows系統環境中也需要有MSYS2環境中所擁有的相關的DLL檔案才行。至於到底需要哪些DLL檔案呢?可以在MSYS2的終端機下執行「ldd」指令來查看,如下:

ldd target/debug/basic.exe | grep /mingw64

rust-gtk

把所有列出來的DLL檔案複製一份存到EXE檔案存在的目錄下(MSYS2環境中的DLL檔案都存在於MSYS2的安裝目錄下,對照一下「ldd」指令查出來的路徑即可找到),或是直接註冊給Windows作業系統來使用。Rust編譯出來的GTK+圖形介面程式就可以直接在Windows作業系統中執行啦!

rust-gtk