ITオムライス

Go言語でGUIツールを作ってみた

2019-05-11 技術系

Go言語でGUIのツールを作れるのか調べてみたら、簡単に作れそうだったので作ってみました。
作ったものは、入力したテキストをURLエンコード、Base64、HTMLエンコードするだけの簡単なツールです。

ライブラリの選択

Go言語でGUIを作るライブラリはいくつかあります。

JeroenD/wxGo

visualfc/go-ui

mattn/go-gtk

今回はWindowsで動くツールを作りたかったので、Windows向けのライブラリのWalkを使うことにしました。

lxn/walk

インストールは下記のコマンドを実行するだけです。

go get github.com/lxn/walk

実装

メインのソースコードを書いていきます。

walkのREADMEに書いているサンプルコードを少し変えるだけで実装できました。

package main

import (
    "encoding/base64"
    "html"
    "log"
    "net/url"

    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
)

func main() {
    var inTE, outTE *walk.TextEdit
    var menu *walk.ComboBox

    var menuItem = []string{
        "URLエンコード",
        "Base64",
        "HTMLエンコード",
    }

    MainWindow{
        Title:   "conversion_tool",
        MinSize: Size{600, 400},
        Layout:  VBox{},
        Children: []Widget{
            ComboBox{
                AssignTo:     &menu,
                Model:        menuItem,
                CurrentIndex: 0,
            },
            HSplitter{
                Children: []Widget{
                    TextEdit{AssignTo: &inTE},
                    TextEdit{AssignTo: &outTE, ReadOnly: true},
                },
            },
            HSplitter{
                Children: []Widget{
                    PushButton{
                        Text: "エンコード",
                        OnClicked: func() {
                            switch menu.CurrentIndex() {
                            case 0:
                                outTE.SetText(url.QueryEscape(inTE.Text()))
                            case 1:
                                outTE.SetText(base64.StdEncoding.EncodeToString([]byte(inTE.Text())))
                            case 2:
                                outTE.SetText(html.EscapeString(inTE.Text()))
                            }
                        },
                    },
                    PushButton{
                        Text: "デコード",
                        OnClicked: func() {
                            switch menu.CurrentIndex() {
                            case 0:
                                str, err := url.QueryUnescape(inTE.Text())
                                if err != nil {
                                    log.Println(err)
                                }
                                outTE.SetText(str)
                            case 1:
                                str, err := base64.StdEncoding.DecodeString(inTE.Text())
                                if err != nil {
                                    log.Println("error: ", err)
                                }
                                outTE.SetText(string(str))
                            case 2:
                                outTE.SetText(html.UnescapeString(inTE.Text()))
                            }
                        },
                    },
                    PushButton{
                        Text: "クリア",
                        OnClicked: func() {
                            inTE.SetText("")
                            outTE.SetText("")
                        },
                    },
                },
            },
        },
    }.Run()
}
ソースコードが書けたので、ビルドして実行したいところですが、Walkはマニフェストファイルがないと実行できないので、マニフェストファイルを作成します。

ファイル名は実行ファイル名.exe.manifestで作成します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
</assembly>

後は、go build してexeファイルを実行するだけです。

無事URLエンコードで来てることが確認できます。 実行時にコマンドプロンプトを表示しないようにするには、ビルド時に以下のオプションをつけます。

go build -ldflags="-H windowsgui"

感想

思ったより簡単に作れました。そこまで、UIにこだわらなければ、そこそこいい感じにしてくれる印象を受けました。すでにCUIで作ってるアプリをGUI化したりは結構簡単にできると思いました。

追記:もうちょっとだけ調べました。
Go言語のwalkを使ってGUIでフォルダを選択する | ITオムライス

参考

WindowsでGo言語でGUIするにはWALKがいいかもしれない - Qiita

関連記事

Go言語でGUIライブラリのFyneを試してみた | ITオムライス

Go言語のGUIライブラリのLorcaを使ってみる | ITオムライス