Go の GUI ライブラリである Fyne について

(別サイトに掲載していたものを抜粋/一部追記修正)

About

GUI アプリケーションでは, ボタンのアイコンとして画像を使用したい, ということがあります. アプリケーションを配布したい場合, 当然画像ファイルなどのリソースファイルもまとめてシングルバイナリとしたいと思います.

Fyne ではこれを行うための仕組みや便利なコマンドが提供されています.

fyne コマンド

Fyne に関するいくつかの操作を実行できる fyne コマンドが提供されています.

https://github.com/fyne-io/fyne/tree/master/cmd/fyne

インストール

go get でインストールします.

$ go get fyne.io/fyne/cmd/fyne

fyne bundle

fyne bundle コマンドを利用することで, 画像等のリソースファイルを Fyne で扱えるデータ(バイト列生データを持った構造体)に変換することができます.

$ fyne bundle foo.svg > bundle.go

bundle.go の中身は以下のようなファイルになっています.

package main

import "fyne.io/fyne"

var fooSvg = &fyne.StaticResource{
	StaticName: "foo.svg",
	StaticContent: []byte{
		... // 生データの数値列

使ってみる

あとは必要な箇所(fyne.Resource 型を要求する箇所)にこの StaticResource を渡してやればよいだけです.

たとえばボタンであれば以下のようになります.

widget.NewButtonWithIcon("button", fooSvg, func() { /* do something */ })

ボタンのアイコンとして SVG ファイルを設定する, というような場合, テーマに合わせて適切な色で描画したいということがあります. theme.NewThemedResource を利用することで, テーマカラーに合わせていい感じの描画を行ってくれます.

widget.NewButtonWithIcon("button", theme.NewThemedResource(fooSvg, nil), func() { /* do something */ })

サンプルアプリケーション

以下のリポジトリでは, 上記の方法で組み込んだアイコンが一部で利用されています.

https://github.com/lusingander/go-gif-viewer

関連するファイルは以下です.

  • Makefilebundle
    • fyne bundle の実行
  • resource.go
    • 自動生成ファイル
  • ./resource/icons/svg/ 以下
    • 生成元アイコン
  • bar.go の頭の var 宣言
    • リソースの読み込み

リンク

公式のチュートリアル: Bundling resources (元記事を書いたときにはまだ存在しなかったはず…)

https://developer.fyne.io/tutorial/bundle