12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HRBrainAdvent Calendar 2024

Day 7

GoのクロスプラットフォームGUIライブラリのGioを触ってみた

Last updated at Posted at 2024-12-07

この記事はHRBrain Advent Calendar 2024 7日目の記事です。

はじめに

今年の1月に入社したyakiniku0220です。
早いもので入社してもう少しで1年経ちます。

今回は少し興味があったライブラリのGioを使ってデスクトップGUIを作ってみます。
作ると言っても本格的なものではなくてサンプルを用いてどういったことができるのかを見ていけたらと思います。

Gioとは

GioはGoでクロスプラットフォームのイミディエイトモードGUIを書くためのライブラリです。
デスクトップ(Windows, macOS, Linux)だけでなく、モバイル(iOS, Android)でも動作するアプリケーションを一つのコードベースで開発できるのが特徴です。

Gioのセットアップ

Gioのinstall

まずはGioのinstallを行います。

go install gioui.org/cmd/gogio@latest

次にmain.goファイルです。
今回はGioに書かれているサンプルをそのまま持ってきます。

package main

import (
	"image/color"
	"log"
	"os"

	"gioui.org/app"
	"gioui.org/op"
	"gioui.org/text"
	"gioui.org/widget/material"
)

func main() {
	go func() {
		window := new(app.Window)
		err := run(window)
		if err != nil {
			log.Fatal(err)
		}
		os.Exit(0)
	}()
	app.Main()
}


func run(window *app.Window) error {
	theme := material.NewTheme()
	var ops op.Ops
	for {
		switch e := window.Event().(type) {
		case app.DestroyEvent:
			return e.Err
		case app.FrameEvent:
			gtx := app.NewContext(&ops, e)

			title := material.H1(theme, "Hello, Gio")
			maroon := color.NRGBA{R: 127, G: 0, B: 0, A: 255}
   
			title.Color = maroon
			title.Alignment = text.Middle
			title.Layout(gtx)

			e.Frame(gtx.Ops)
		}
	}
}

最後に依存関係の更新をします。

go mod tidy

起動させる

先ほど作ったmain.goファイルを実行してみます。

go run .

するとこのように起動します。

スクリーンショット 2024-12-06 2.31.46.png

サンプルコードでどのような処理が行われてGUIが起動していくか見ていきます。

func main() {
    go func() {
        window := new(app.Window)
        err := run(window)
        if err != nil {
            log.Fatal(err)
        }
        os.Exit(0)
    }()
    app.Main()
}

この部分では、main関数はアプリケーションループを起動してOSとやり取りし、ウィンドウの動作を別のゴルーチンで開始しています。

theme := material.NewTheme()

次の処理ではテーマを使ってウィンドウ内のUIを設定しています。

for {
	switch e := window.Event().(type) {
	case app.DestroyEvent:
		return e.Err
	case app.FrameEvent:
    ...

app.DestroyEventはユーザーが閉じるボタンを押した時に処理されるコードになっており、app.FrameEventはプログラムが入力を処理し、新しいフレームをレンダリングする処理になっています。このようにして、各イベントに応じた処理を行うことで、アプリケーションの動作を制御します。

// このグラフィックスコンテキストはレンダリング状態を管理するために使用されます。
gtx := app.NewContext(&ops, e)

// 適切なテキストで大きなラベルを定義します。
title := material.H1(theme, "Hello, Gio")

// ラベルの色を変更します。
maroon := color.NRGBA{R: 127, G: 0, B: 0, A: 255}
title.Color = maroon

// ラベルの位置を変更します。
title.Alignment = text.Middle

// ラベルをグラフィックスコンテキストに描画します。
title.Layout(gtx)

// 描画操作をGPUに渡します。
e.Frame(gtx.Ops)

最後にGUI上に表示するtextの処理です。
サンプルではtextですが、他にもinputだったりbuttonなどの描画も可能です。

まとめ

初めてGioを触ってみましたがドキュメントが丁寧に書かれているのでGo歴が浅い私でも簡単に扱えました。
Gioを使って作られたGUIがドキュメント内にあったりするので、それを参考に自分が作りたいGUIを作ってみるのは良さそうです。
https://gioui.org/doc/showcase

最後に

株式会社HRBrainでは新しいメンバーを募集中です。
興味がある方は下記のリンクから宜しくお願い致します。

12
8
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
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?