Golang UI fyne.io初探

Golang對網路來說是門友善的語言
對於UI
其實搭配使用web的方式會比較好
擴展性高,支援多個平台

但桌面型式的UI(GUI)在目前也是不可取代的
Golang也是有GUI的項目
但還不像是Qt那樣的方便及資源眾多

  • lxn/walk – 只能用於windows下的UI庫
  • therecipe/qt – Golang的qt綁定庫
  • go-astilectron – Golang與electron的交互,基於html、css
  • zserge/lorca – 一樣是基於html、css的UI,與go-astilection不一樣的是,在打包的時候不會把整個electron包進去,所以程式會小很多
  • fyne-io/fyne – golang原生UI庫,目前還在更新

以上介紹筆者用過的
其它可在awesomego裡找看看有無符合看官需求
lxn/walk不是跨平台的
go-astilectron跟zserge/lorca都是用html的方式構建
go-astilectron就是本來electron的後端由nodejs改成golang
build的時候就跟electron build出來有一樣的缺點,就是很大包
但lorca則是改成使用使用者安裝的瀏覽器,讓執行檔有效的變小

如果不想用到html系列的話
還有therecipe/qt跟fyne-io/fyne可以用
但therecipe/qt在筆者環境下(ubuntu18.04)
qt環境一直搞不起來
設定也很復雜…

而fyne-io就相對的單純許多
因是原生支援,不用綁定cgo
但也是很多缺點
預設為material design
控件不能客制化,意謂著不能設計很誇張很漂亮的UI
目前也不支援UI顯示中文
開發團隊有努力的在滿足大家的需求
也持續的更新中
是筆者想投資的方向之一

雖然筆者本身會用C++ Qt Framework、pyside
但C++不好寫,pyside因是python顯得很慢
所以才會想用golang從中取得平衡

fyne的控件目前有這麼多種
對於簡單的應用應該也是夠了
於fyne/widget中定義
也有客制化的fyne/canvas
widget的struct定義中包含2個屬性

type Widget interface {
    CanvasObject
    CreateRenderer() WidgetRenderer
}

CanvasObject負責這個控件的行為跟狀態
WidgetRenderer負責控件在畫面上的繪出
上面有提到
fyne不太能客制化
所以Renderer在基礎的我們就不會去碰到

至於排版的部分
則是跟Qt一樣用Layout(應該大部份的GUI都是吧?)
但沒有像Qt design那樣的IDE
在Widget中放入NewContainerWithLayout
Widget當父元件,NewContainerWithLayout為他的子元件
NewContainerWithLayout下面再增加子控件

除了官網的範例
在我的github有試做給自己的GUI(還在開發中)
也可以參考看看喔

佶曰:Qt真得很強大

發佈留言