ITオムライス

Go言語のwalkを使ってGUIでフォルダを選択する

2019-12-15 技術系

Go言語のWalkというライブラリでダイヤログで選択する方法と、アプリのウィンドウにドラッグ&ドロップやつの実装方法を調べました。

ダイヤログで選択

下のサイトを参考にして書きました。
Go言語 - WALKでGUI - FileDialog - hakeの日記

package main

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

import (
	"fmt"
	"os"
)

type MyMainWindow struct {
	*walk.MainWindow
	edit *walk.TextEdit

	path string
}

func main() {
	mw := &MyMainWindow{}

	MW := MainWindow{
		AssignTo: &mw.MainWindow,
		Title:    "FileDialogテスト",
		MinSize:  Size{320, 200},
		Layout:   VBox{},
		Children: []Widget{
			TextEdit{
				AssignTo: &mw.edit,
				ReadOnly: true,
			},
			PushButton{
				Text:      "Open Dialog",
				OnClicked: mw.Clicked,
			},
		},
	}

	if _, err := MW.Run(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}

}

func (mw *MyMainWindow) Clicked() {

	dlg := new(walk.FileDialog)
	dlg.FilePath = mw.path
	dlg.Title = "Select File"
	dlg.Filter = "All files (*.*)|*.*"

	if ok, err := dlg.ShowOpen(mw); err != nil {
		mw.edit.AppendText("Error : File Open\r\n")
		return
	} else if !ok {
		mw.edit.AppendText("Cancel\r\n")
		return
	}
	mw.path = dlg.FilePath
	s := fmt.Sprintf("%s\r\n", mw.path)
	mw.edit.AppendText(s)
}

ドラッグ&ドロップ

Walkのドキュメントにサンプルコードが上がっていました。
walk/dropfiles.go at master · lxn/walk

package main

import (
	"strings"

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

func main() {
	var textEdit *walk.TextEdit
	MainWindow{
		Title:   "Walk DropFiles Example",
		MinSize: Size{320, 240},
		Layout:  VBox{},
		OnDropFiles: func(files []string) {
			textEdit.SetText(strings.Join(files, "\r\n"))
		},
		Children: []Widget{
			TextEdit{
				AssignTo: &textEdit,
				ReadOnly: true,
				Text:     "Drop files here, from windows explorer...",
			},
		},
	}.Run()
}

参考

walk - GoDoc

walk/dropfiles.go at master · lxn/walk

Go言語 - WALKでGUI - FileDialog - hakeの日記

関連記事

Go言語でGUIツールを作ってみた | ITオムライス

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

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