LoginSignup
5
3

More than 5 years have passed since last update.

GoでGUI使いたい!

Last updated at Posted at 2016-12-24

はじめに

タイトル通りです。
しかし各所で言われているとおりGUIはGoの苦手な部分と言われています。

この記事ではandlabs/uiを使用して簡単なGUIを作成してみたいと思います。
(なお上記プログラムのWikiの日本語訳に近いものになってしまいますがご容赦ください)

入門

(GOPATHおよびgo getについては省略します)
この例ではユーザが名前を入力してからボタンを押すと表示するプログラムを作成します。
まず下のソースコードを実行しましょう。細かい部分は後で解説します。

main.go
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)
次のように表示されます。

Run.png

おわりに

間違い等ありましたらTwitterかコメントにお願いします。

適当なサンプル作りました -> こちら

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3