golangのGUIパッケージgo-gtkを試す

  • 15
    いいね
  • 0
    コメント

URL

https://github.com/mattn/go-gtk

環境

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-gtkサンプル.png

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)

go-gtk2.png

中央にあるのが標準みたいですね。

全体のソースコード

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を実行したらめちゃくちゃ早くなりました。

go-gtk製作者の@mattnさん、リンク先記事でナイスなコメントをした@mattnさん、ありがとうございます。