Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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さん、ありがとうございます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした