はじめに
タイトル通りです。
しかし各所で言われているとおりGUIはGoの苦手な部分と言われています。
この記事ではandlabs/uiを使用して簡単なGUIを作成してみたいと思います。
(なお上記プログラムのWikiの日本語訳に近いものになってしまいますがご容赦ください)
入門
(GOPATHおよびgo getについては省略します)
この例ではユーザが名前を入力してからボタンを押すと表示するプログラムを作成します。
まず下のソースコードを実行しましょう。細かい部分は後で解説します。
package main
import (
"github.com/andlabs/ui"
)
func main() {
err := ui.Main(func() {
name := ui.NewEntry()
button := ui.NewButton("Greet")
greeting := ui.NewLabel("")
box := ui.NewVerticalBox()
box.Append(ui.NewLabel("Enter your name:"), false)
box.Append(name, false)
box.Append(button, false)
box.Append(greeting, false)
window := ui.NewWindow("Hello", 200, 100, false)
window.SetChild(box)
button.OnClicked(func(*ui.Button) {
greeting.SetText("Hello, " + name.Text() + "!")
})
window.OnClosing(func(*ui.Window) bool {
ui.Quit()
return true
})
window.Show()
})
if err != nil {
panic(err)
}
}
解説
Package UIの実行
var window ui.Window
初めにui.Window
型のグローバル変数を宣言します。
Windowは他のControl(TextField, Buttonなど)を保持します。Controlを表示するためにはWindowに追加されていなければなりません。(ただしWindowはControlではありません)
ui.Main(func() {...})
ui.Main()
はUIのメインループです。 この中でControl, WindowのShow, Quitなどを管理します。
Control.On<Action>(func(*ui.Control) {...})
これはControlのイベントハンドラを指定します。
Controlではそれぞれに対応したイベントハンドラが存在します。
UIの構築
name := ui.NewEntry()
button := ui.NewButton("Greet")
greeting := ui.NewLabel("")
これらはテキストフィールド、ボタン、ラベルを作成します。
stack := ui.NewVerticalStack(
ui.NewLabel("Enter your name:"),
name,
button,
greeting)
Package UIのControlはレイアウトコンテナを使用して配置されます。これはGTK+やQtと同じです。
水平や垂直にスタックするものを基本とし、これらは幅や高さに応じて変わります。
今回は垂直に配置するものを使用します。またlabelに関しては何も変更しないので直接定義します。
window = ui.NewWindow("Hello", 200, 100, false)
window.SetChild(stack)
これでウィンドウをを作成する準備ができました。
ui.NewWindow()
はタイトル, 幅, 高さ, メニューバーを持つかをパラメタに指定します。
WindowはControlを一つしか持てませんがスタックはControlなのでスタックをWindowに指定するだけです。
イベント
button.OnClicked(func() {
greeting.SetText("Hello, " + name.Text() + "!")
})
これはボタンがクリックされたときのイベントハンドラを指定します。
イベントハンドラはui.Do()
が実行されたあとに実行されます。
イベントハンドラは安全にUIを操作することができ、イベントハンドラが実行されている間は他のゴルーチンからは実行されません。
イベントハンドラは簡単であるべきです。
window.OnClosing(func() bool {
ui.Stop()
return true
})
ユーザーがWindowを閉じたときに正常終了するにはw.OnClosing()
を使います。
この場合、ui.Stop()
を呼び出してUIメインループを終了し、Windowを閉じるためにtrueを返します。
仕上げ
window.Show()
これはWindowを表示するだけです。
ビルドして実行してみましょう(Windowならgo build -ldflags -H=windowsgui main.go
)
次のように表示されます。
おわりに
間違い等ありましたらTwitterかコメントにお願いします。
適当なサンプル作りました -> こちら