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

來源:互聯網
上載者:User

標籤:targe   div   ram   out   經驗   channels   nal   找不到   visible   

半官方: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的首頁裡找到:http://blog.golang.org/a-conversation-with-the-go-team

我用過幾個比較方便的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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.