1. 程式人生 > >Go語言的GUI方案,與Qt和QML都能綁定,也有從頭寫的gxui

Go語言的GUI方案,與Qt和QML都能綁定,也有從頭寫的gxui

tool ins 感覺 for wid called 路徑 linu 適合

半官方:https://godoc.org/golang.org/x/exp/shiny

作者:王益
鏈接:https://www.zhihu.com/question/22483719/answer/21753337
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

我從2014年底開始使用 andlabs/ui · GitHub 開發GUI 程序。這個庫支持多個操作系統,包括 Linux 和 MacOSX。而且 API 和程序結構充分使用了 Go 的特色語法:lambda、goroutine 和channels。看看這個庫的代碼,能充分意識到 Go 其實比 Objective-C、Java、C++、Python、Tcl/Tk、MATLAB 都更適合用來開發 GUI 程序——程序簡練,功能豐富,執行高效。唯一的遺憾是,它只支持桌面操作系統。我問了一下作者可否支持 mobile 開發(support iOS? · Issue #64 · andlabs/ui · GitHub)
,作者覺得 mobile GUI 程序寫法和桌面GUI 程序差異太大,應該用另一個庫來支持 mobile GUI 的開發。

以下回答來自我的博客:GUI Programming Using Go;希望起到收集匯總一些信息的作用。

Go語言裏有個有意思的話題,是如何用Go語言寫GUI程序。因為Go的標準packages沒有用來寫GUI程序的,所以很多人在問,能否有一個標準GUI package?

2013年6月,有一個Go Authors的訪談。其中也有人問到上述問題。Rob Pike直接提到他年輕的時候設計的Newsqueak語言,一個專門用來寫GUI程序的語言。Andrew Gerrand趕緊把話題拉回來,介紹了幾個他看到的比較好的第三方GUI packages。這段訪談的縮減版可以在Go的主頁裏找到:

我用過幾個比較方便的GUI toolkit,包括GTK和Qt。根據這麽點兒經驗,我贊同Rob Pike對Go語言在GUI編程中的前景:

  1. Go支持memory garbage collection。這樣可以方便的管理widgets的memory消耗。用過GTK的人應該都被迫理解基於C設計的floating reference機制吧?這篇gotk3的作者寫的博客,專門介紹了如何基於Go語言重新設計GUI widgets的內存管理機制。值得一讀,很有啟發!

  2. Go的concurrency應該能方便的讓GUI不被後臺處理拖累,保持界面反應的流暢。大家還記得當年BeOS(要不是Jobs介入,Apple本來要收購的;最後收購了NeXT)嗎?它的一個重要特點就是使用multithreading技術保證GUI總是有反應。

雖然Andrew Gerrand當時舉得例子go.uik的作者已經把項目關掉了,並且號稱“如果再打開,一定要重寫”:

This project is closed. If I begin again, it will be from scratch and using lessons learned while writing go.uik. Of course, if I begin again it will still be called go.uik.

但是其他項目層出不窮。我上周在我的iMac(Mavericks)上嘗試了go-qt5,這是一個Qt 5的Go語言binding。今天剛剛嘗試了gotk3,一個完全用Go的內存管理方式(idiomatic)寫的GTK的binding。感覺都很不錯。因為這兩個項目都在快速演進中,它們主頁上介紹的用法和實際操作略有不同。這裏列一下我的操作。

go-qt5

主頁上的tutorial在我的環境下不完全好使,我的總結在這裏。或者簡單記錄操作流程如下:

  1. 用Homebrew安裝5.2:

     brew update && brew doctor && brew install qt5
    

    這會提醒你說“目前世界上大部分人都在用Qt4,要不不要這麽激進用Qt5啊?”(Homebrew真的很人性化。)但是很不好意思的,Qt4不支持最新版本的OS X Mavericks。

  2. 檢出go-qt5代碼:

     mkdir -p /home/you/go-qt5
     export GOPATH=/home/you/go-qt5
     go get github.com/salviati/go-qt5
    
  3. Build go-qt5

基本上可以按照go-qt5的README來操作。有幾點要註意:因為Homebrew不會在/usr/local/bin下面創建指向Qt 5的symbolic links,所以你調用qmake的時候可能需要用全路徑名:/usr/local/Cellar/qt5/5.2.0/bin/qmake。另外,運行自己寫的Qt程序的時候,要記得把鏈接庫$GOPATH/src/github.com/salviati/go-qt5/lib/libgoqt5drv.1.0.0.dylib和你的程序放在同一個目錄下。

gotk3

在Mac OS X上得安裝和使用基本上就根據這篇文章來,但是有兩點需要註意:

如果build GTK3的時候,報錯找不到-lpython2.7,可以通過LDFLAGS環境變量告訴jhbuild Python的庫在哪裏。比如:

LDFLAGS=-L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/lib/ jhbuild build meta-gtk-osx-gtk3

另外,編譯gotk3的時候,不需要用jhbuild shell啟動一個新的shell,只需要設置一下環境變量:

export PKG_CONFIG_PATH=/Users/wangyi/gtk/inst/lib/pkgconfig:/Users/wangyi/gtk/inst/share/pkgconfig:/usr/lib/pkgconfig    

然後就可以通過go get下載和編譯gotk3了。

go get github.com/conformal/gotk3/gtk

https://github.com/go-qml/qml
https://github.com/google/gxui

https://www.zhihu.com/question/22483719

Go語言的GUI方案,與Qt和QML都能綁定,也有從頭寫的gxui