URL
環境
Ubuntu16.04 64bit
go1.8.0
GTK(GIMP Tool Kit)は使ったことがない
インストール
apt-get install libgtk2.0-dev libglib2.0-dev libgtksourceview2.0-dev
go get github.com/mattn/go-gtk/gtk
# go installについては後述、必須ではない
go install github.com/mattn/go-gtk/gtk
Windowsでも動くみたいですが、linuxで導入が簡単ということはそっちで開発したほうが間違いないでしょう。
手順が増えるとミスも起こりやすくなります。
うごけー!
exampleを覗いて、最低限の機能だけを取り出しました。
package main
import "github.com/mattn/go-gtk/gtk"
func main() {
gtk.Init(nil) // 無いとpanic
win := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) // ウインドウを作成
win.ShowAll() // ウインドウを表示
gtk.Main() // シグナル受信を待機
}
goで良く用いられるshinyと比べると相当短く書くことができます。
環境構築は面倒なのでトレードオフですね。
設定
これだけでは使えないので、win(ウインドウ用の変数)に設定を追加します。
win.SetTitle("空のウィンドウ") // タイトルバーに表示される
win.SetSizeRequest(400, 300) // サイズ指定
win.Connect("destroy", gtk.MainQuit) // ✘ボタンでプログラムを停止(gtk.Main()の待機を終了)
簡単な設定だけ。
オブジェクト追加
簡単に調べた感じだとGTKではオブジェクトじゃなくって、ウィジットとかコンテナウィジットとか言うそうです。
とりあえず文字といえばラベルかな?ということで予測を出すと、gtk.NewLabel(string)という関数が。
lab := gtk.NewLabel("このツールはgo-gtkのテストです。")
win.Add(lab)
中央にあるのが標準みたいですね。
全体のソースコード
package main
import "github.com/mattn/go-gtk/gtk"
func main() {
gtk.Init(nil)
win := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
win.SetTitle("空のウィンドウ")
win.SetSizeRequest(400, 300)
win.Connect("destroy", gtk.MainQuit)
lab := gtk.NewLabel("このツールはgo-gtkのテストです。")
win.Add(lab)
win.ShowAll()
gtk.Main()
}
総評
GTK初心者にも簡単に使える
詳しく調べたりせず、結構適当に書いても動いてしまう。
利点ではありますが、「クロスコンパイルのためにこの関数を呼び出しておくべき」みたいなルールがあったら怖いですね。
ちゃんとしたツールを作りたい時にはちゃんと調べます。
私と同じGolangとGUI経験者であれば、同じようにgo-gtkが簡単に使えるのではないでしょうか。
コンパイル・実行
コンパイルが遅くて、実行が速い。
コンパイルはi7の高性能なCPU/SSD環境で8秒強。
実用的ではないレベルと思っていましたが...
cgoがGoのコンパイル速度に与える影響
こちらを参考に、予めgo install github.com/mattn/go-gtk/gtk
を実行したらめちゃくちゃ早くなりました。