Fyne は一つのアプリケーションを一つディレクトリにまとめることになっています。 今回は ToDo とうディレクトリにまとめることにします。 場所はどこでも構わないのですが、私はホームディレクトリに Documets というディレクトリを作り、その中に fyne というディレクトリを作り、そしてその中に、 ToDo ディレクトリを作りました。 今後はこの ToDo ディレクトリでの作業になります。
ToDo ディレクトリに移動し、次のようにコマンドして、 Fyne アプリケーションの初期設定を行います。 次のコマンドで初期内容は自動で設定されます。
go mod init example.com/ToDo
// 通常は、example.com の部分を、あなたが持っているURLにします。
// URL をお持ちでない場合は、example.com などで大丈夫です。
// もし URL をお持ちなら、あなたさえ同じ名前のアプリケーションを作らなければ、
// 世界で、一つだけのアプケーション ID が生成されることになります。
// デフォルトでは、スラッシュ(/)の次の名前がアプリの名前になります。
ToDo ディレクトリに、todo.go というファイルを作り、次のように記述します。 main 関数を記述しているファイルは、 main.go とするのが一般的ですが、 好きなファイル名にしても大丈夫です。
package main
import (
"bufio"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"os"
)
var data = []string{}
const path string = "/home/ユーザー名/todo.txt"
func read(filename string) error {
file, _ := os.Open(filename)
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
data = append(data, line)
}
return nil
}
func save(filename string) error {
file, _ := os.Create(path)
defer file.Close()
for _, line := range data {
file.WriteString(line + "\n")
}
return nil
}
func main() {
read(path)
row := -1
app := app.New()
//app.Settings().SetTheme(&myTheme{})
win := app.NewWindow("ToDo")
list := widget.NewList(
func() int {
return len(data)
},
func() fyne.CanvasObject {
return widget.NewLabel("template")
},
func(i widget.ListItemID, o fyne.CanvasObject) {
o.(*widget.Label).SetText(data[i])
},
)
list.OnSelected = func(id int) { row = id }
add := widget.NewButtonWithIcon("", theme.ContentAddIcon(),
func() {
entry := widget.NewEntry()
dialog.ShowForm("Add ToDo", "Add", "Cancel",
[]*widget.FormItem{
widget.NewFormItem("Enter...", entry)},
func(b bool) {
if b && entry.Text != "" {
data = append([]string{entry.Text}, data...)
list.Refresh()
save(path)
}
}, win)
})
edit := widget.NewButtonWithIcon("", theme.DocumentCreateIcon(),
func() {
if row != -1 {
entry := widget.NewEntry()
entry.SetText(data[row])
dialog.ShowForm("Edit ToDo", "Edit", "Cancel",
[]*widget.FormItem{
widget.NewFormItem("Enter...", entry)},
func(b bool) {
if b && row != -1 {
data[row] = entry.Text
list.Refresh()
save(path)
}
}, win)
}
})
remove := widget.NewButtonWithIcon("", theme.ContentRemoveIcon(),
func() {
if row != -1 {
dialog.ShowConfirm("Delete ToDo",
"Are you sure to remove this item?",
func(b bool) {
if b {
data = append(data[:row], data[row+1:]...)
list.Unselect(row)
list.Refresh()
save(path)
}
}, win)
}
})
up := widget.NewButtonWithIcon("", theme.MoveUpIcon(),
func() {
if row != 0 && row != -1 {
temp := data[row]
data = append(data[:row], data[row+1:]...)
data = append(data[:row-1],
append([]string{temp}, data[row-1:]...)...)
row -= 1
list.Select(row)
list.Refresh()
save(path)
}
})
down := widget.NewButtonWithIcon("", theme.MoveDownIcon(),
func() {
if row != len(data)-1 && row != -1 {
temp := data[row]
data = append(data[:row], data[row+1:]...)
data = append(data[:row+1],
append([]string{temp}, data[row+1:]...)...)
row += 1
list.Select(row)
list.Refresh()
save(path)
}
})
quit := widget.NewButtonWithIcon("", theme.CancelIcon(),
func() {
app.Quit()
})
buttons := container.New(layout.NewVBoxLayout(),
add, edit, up, down, remove, layout.NewSpacer(), quit)
content := container.New(layout.NewBorderLayout(nil, nil, nil, buttons),
buttons, list)
win.SetContent(content)
win.Resize(fyne.NewSize(400, 300))
win.ShowAndRun()
}
Todo ディレクトリに戻り、次のようにコマンドすると、記述した go ファイルを正しいインデントや改行に整形してくれます。また完全にではありませんが、 記述エラーも検出してくれるみたいです。
go fmt todo.go
// todo.go とだけ表示されなければ、この段階では問題ありません。
todo.go
今の段階で、todo.go を実行しようとすると、パッケージの追加を促されます。
// 実行してみる
go run todo.go
// 次のようにパッケージの追加を促されます
odo.go:5:2: no required module provides package fyne.io/fyne/v2; to add it:
go get fyne.io/fyne/v2
todo.go:6:2: no required module provides package fyne.io/fyne/v2/app; to add it:
go get fyne.io/fyne/v2/app
todo.go:7:2: no required module provides package fyne.io/fyne/v2/container; to add it:
go get fyne.io/fyne/v2/container
todo.go:8:2: no required module provides package fyne.io/fyne/v2/dialog; to add it:
go get fyne.io/fyne/v2/dialog
todo.go:9:2: no required module provides package fyne.io/fyne/v2/layout; to add it:
go get fyne.io/fyne/v2/layout
todo.go:10:2: no required module provides package fyne.io/fyne/v2/theme; to add it:
go get fyne.io/fyne/v2/theme
todo.go:11:2: no required module provides package fyne.io/fyne/v2/widget; to add it:
go get fyne.io/fyne/v2/widget
// 指示のとおりパッケージを追加します。
go get fyne.io/fyne/v2
go get fyne.io/fyne/v2/app
go get fyne.io/fyne/v2/container
go get fyne.io/fyne/v2/dialog
go get fyne.io/fyne/v2/layout
go get fyne.io/fyne/v2/theme
go get fune.io/fyne/v2/widget
この追加したパッケージは、そのアプリケーションだけに有効で、 アプリケーションを作るたびに、追加するパッケージが要求されます。 追加するパッケージは、アプリケーションによって違います。
実際に実行する場合は、X11 が必要なので、次のようにコマンドします。
go run todo.go & X -retro
+ ボタンでアイテム(item、項目)を追加できます。
鉛筆マークボタンでアイテムを編集できます。
↑ ボタンでアイテムを上へ移動できます。
↓ ボタンでアイテムを下へ移動できます。
X ボタンで ToDo アプリケーションを終了できます。
X11 ではウィンドウのフレーム(タイトルバーやリサイズする機能)は付きません。
todo.go のコードに間違いがあった場合でも、X11 は起動しますが、 ToDo アプリケーションは起動しません。
X ボタンをクリックすると、ToDo アプリケーションは終了しますが、 X11 を終了するには次のようにします。
// 次のコマンドで X11 の画面が閉じます
Ctrl + Alt + F1
// F1 のところは、X11 を起動したコンソールの番号に合わせt、F1、F2、F3 と変えていきます
// ほとんどの場合、コンソール番号 1 からの起動なので、F1 にしました
// 画面は閉じても X11 のタスクは起動したままです。次のコマンドで X11 は完全に終了します
Ctrl + C
Linux ではビルドしたアプリケーションに直接アイコンがつくことはありません。 アイコンは別の方法で登録します。そもそも CentOS MInimal ではアイコンを登録しても 無意味です。しかし Fyne をビルドする時に アイコンファイルがないとビルドできない仕組みになっています。
Fyne で使えるアイコンファイルは png だけです。png ファイルを Fyne がそれぞれの OS のアイコンファイルへ変換してくれます。
アイコンファイルへの URL が分かっていれば、wget でダウンロードすることができます。 あるいは X11 で起動した Firefox でダウンロードすることもできるかもしれません。 試してみましたが、どの場所にダウンロードしたのかまだ見つけられていません。
もしアイコンファイルが用意できなければ、ダミーの PNG ファイルを作ります。
// PNG ファイルを用意できなかった場合は、次のようにしてダミーの PNG ファイルを作ります。
touch leaf.png
// ビルドします。アイコンファイル名は、あなたが用意したファイルの名前です。
fyne package -os linux -icon leaf.png
// Theme ディレクトリに Theme.tar.gz 圧縮ファイルができますので、それを展開します
tar vxzf Theme.tar.gz
// usr というディレクトリが作られ
// usr/local/bin の中に todo という実行ファイルができます
// usr/local/bin に移動してそこで実行するか
// todo 実行ファイルを ToDo ディレクトリに移動して実行します。
// usr/local/bin へ移動
cd usr/local/bin
// todo 実行ファイルを ToDo ディレクトリへコピー
cp todo ../../../
// ToDo ディレクトリへ移動
cd ../../../
// ToDo ディレクトリで todo 実行ファイルを X11 で実行
./todo & X -retro
Theme & X -retro
だけで起動できるようになります。しかし、/bin
ディレクトリにどんな名前の実行ファイルがあるかはっきりしない場合は、
うっかりと上書きしてしまう場合がありますので、あまりおすすめしません。