Fyne   Menu

ホーム   Goチュートリアル

Menu


この章では、メニューを作る方法を説明しています。 ショートカットキーについても説明します。

ショートカットキーは、Windows と macOS で少しコードが違います。 winmenu.go が Windows 用のコードで、macmenu.go が macOS 用のコードです。

Linux は Windows と同じコードになります。


アプリケーションディレクトリの作成

ターミナルを起動して、次のようにしてアプリケーション作成の下準備をします。 ディレクトリはどこでも構いませんが、Documents などに go か fyne などのディレクトリを作って、さらに次のようにディレクトリを作るのが良いでしょう。


mkdir Menu
cd Menu
go mod init example.com/Menu

// 通常は、example.com の部分を、あなたが持っているURLにします。
// デフォルトでは、スラッシュ(/)の次の名前がアプリの名前になります。
    


コードの記述

次のファイルを記述します。main 関数を記述しているファイルは、 main.go とするのが一般的ですが、好きなファイル名にしても構いません。

Windows 用と Linux 用のコードが winmenu.go で、macOS 用のコードが macmenu.go です。

winmenu.go


package main

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/driver/desktop"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/widget"
)

var aloha = widget.NewLabel("Aloha ~~~~~~~~~~~~ :-)")

func makeMenu() *fyne.MainMenu {
	var menuFile = fyne.NewMenu("File",
		fyne.NewMenuItem("New", func() { aloha.SetText("New") }),
	)
	var menuEdit = fyne.NewMenu("Edit",
		fyne.NewMenuItem("Undo", func() { aloha.SetText("Undo") }),
		fyne.NewMenuItemSeparator(),
		fyne.NewMenuItem("Cut", func() { aloha.SetText("Cut") }),
		fyne.NewMenuItem("Copy", func() { aloha.SetText("Copy") }),
		fyne.NewMenuItem("Paste", func() { aloha.SetText("Past") }),
		fyne.NewMenuItem("Slect All", func() { aloha.SetText("Select All") }),
		fyne.NewMenuItemSeparator(),
		fyne.NewMenuItem("Aloha ~~~", func() {
			aloha.SetText("Aloha ~~~~~~~~~~~~ :-)")
		}),
	)
	var menu = fyne.NewMainMenu(menuFile, menuEdit)
	return menu
}
func main() {
	app := app.New()
	win := app.NewWindow("Menu")
	win.SetMainMenu(makeMenu())
	content := container.New(layout.NewCenterLayout(), aloha)
	win.SetContent(content)
	win.Resize(fyne.NewSize(400, 200))
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyN,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("New") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyQ,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { app.Quit() },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyU,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("Undo") },
	)
	win.Canvas().AddShortcut(
		&fyne.ShortcutCut{Clipboard: win.Clipboard()},
		func(s fyne.Shortcut) { aloha.SetText("Cut") },
	)
	win.Canvas().AddShortcut(
		&fyne.ShortcutCopy{Clipboard: win.Clipboard()},
		func(s fyne.Shortcut) { aloha.SetText("Copy") },
	)
	win.Canvas().AddShortcut(
		&fyne.ShortcutPaste{Clipboard: win.Clipboard()},
		func(s fyne.Shortcut) { aloha.SetText("Paste") },
	)
	win.Canvas().AddShortcut(
		&fyne.ShortcutSelectAll{},
		func(s fyne.Shortcut) { aloha.SetText("Select All") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyA,
			Modifier: desktop.AltModifier,
		},
		func(s fyne.Shortcut) {
			aloha.SetText("Aloha ~~~~~~~~~~~~ :-)")
		},
	)
	win.ShowAndRun()
}
    

macmenu.go


package main

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/driver/desktop"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/widget"
)

var aloha = widget.NewLabel("Aloha ~~~~~~~~~~~~ :-)")

func makeMenu() *fyne.MainMenu {
	var menuFile = fyne.NewMenu("File",
		fyne.NewMenuItem("New", func() { aloha.SetText("New") }),
	)
	var menuEdit = fyne.NewMenu("Edit",
		fyne.NewMenuItem("Undo", func() { aloha.SetText("Undo") }),
		fyne.NewMenuItemSeparator(),
		fyne.NewMenuItem("Cut", func() { aloha.SetText("Cut") }),
		fyne.NewMenuItem("Copy", func() { aloha.SetText("Copy") }),
		fyne.NewMenuItem("Paste", func() { aloha.SetText("Past") }),
		fyne.NewMenuItem("Select All", func() { aloha.SetText("Select All") }),
		fyne.NewMenuItemSeparator(),
		fyne.NewMenuItem("Aloha ~~~", func() {
			aloha.SetText("Aloha ~~~~~~~~~~~~ :-)")
		}),
	)
	var menu = fyne.NewMainMenu(menuFile, menuEdit)
	return menu
}
func main() {
	app := app.New()
	win := app.NewWindow("Menu")
	win.SetMainMenu(makeMenu())
	content := container.New(layout.NewCenterLayout(), aloha)
	win.SetContent(content)
	win.Resize(fyne.NewSize(400, 200))
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyN,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("New") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyU,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("Undo") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyX,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("Cut") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyC,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("Copy") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyV,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("Paste") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyA,
			Modifier: desktop.ControlModifier,
		},
		func(s fyne.Shortcut) { aloha.SetText("Select All") },
	)
	win.Canvas().AddShortcut(
		&desktop.CustomShortcut{
			KeyName:  fyne.KeyA,
			Modifier: desktop.AltModifier,
		},
		func(s fyne.Shortcut) {
			aloha.SetText("Aloha ~~~~~~~~~~~~ :-)")
		},
	)
	win.ShowAndRun()
}
	


パッケージの読み込み

コードの記述が完了しましたら、次のようにして実行します。


go run winmenu.go
// もしくは
go run macmenu.go

// 次のようにパッケージをインストールしてくださいという表示が出ます。
	go get fyne.io/fyne/v2
slider.go:5:2: no required module provides package fyne.io/fyne/v2/app; to add it:
	go get fyne.io/fyne/v2/app
slider.go:6:2: no required module provides package fyne.io/fyne/v2/canvas; to add it:
	go get fyne.io/fyne/v2/canvas
slider.go:7:2: no required module provides package fyne.io/fyne/v2/container; to add it:
	go get fyne.io/fyne/v2/container
slider.go:8:2: no required module provides package fyne.io/fyne/v2/layout; to add it:
	go get fyne.io/fyne/v2/layout
slider.go:9: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/canvas
go get fyne.io/fyne/v2/container
go get fyne.io/fyne/v2/layout
go get fune.io/fyne/v2/widget

// もう一度実行してみます。
go run winmenu.go
// もしくは
go run macmenu.go
    


実行結果

デフォルトでは、Windowsの場合は白いウィンドウ、macOSとLinuxの場合は、 黒いウィンドウになります。

New、Quit、Undo、Cut、Copy、Paste には Control キーと N、Q、U、X、C、V との組み合わせがショートカットキーとして割り当てられています。
Aloha には Alt と A の組み合わせがショートカットキーとして割り当てられています。

macOS の場合の Quit については、自動的に Command + Q がショートカットキーとして設定されています。


アプリケーションのパッケージ化

アプリケーションのパッケージ化は、ダブルクリックで起動する、 アイコンのついたファイルにすることです。

アイコンを自作するか、次のサイトなどからお気に入りのアイコンをダウンロードします。 大きさは一番大きい 512px のものを、種類は png にします。Fyne では png 形式のファイルしかアイコンに変換できないみたいです

フリーアイコンSVG、PNG、ICO、ICNS

アイコンの準備ができましたら、Form ディレクトリの中に入れます。 そしてターミナルに次のようにコマンドしてパッケージ化します。


fyne package -os darwin -icon leaf.png

// -os のところは、Windows の場合は windows、macOS の場合は darwin、Linux の場合は linux にします。
// -icon のところは、あなたが png ファイルにつけた名前にします。
    


コード説明

コード説明は一旦割愛して、先へ進みます。また戻ってきてコード説明をしたいと思います。


25011 visits
Posted: Jun. 22, 2021
Update: Jun. 25, 2021

ホーム   Goチュートリアル   目次