秋来冬风的博客

App和Windows,Fyne笔记第2篇

目录

这是我的Fyne学习笔记系列第2篇。

App

在Fyne里,许多关键的类型是接口定义的,有些特定功能X有两个方法,SetX是设置,X是获取。

App类型本身是一个包含多个方法的接口。

除了上一篇已经写过的NewWindow来创建窗口,还有这些与整个程序相关的功能的方法:

打开浏览器

a := app.New() //fyne.io/fyne/v2/app
u, _ := url.Parse("https://to-link.com")
a.OpenURL(u) 

可以将指定链接在系统默认浏览器打开。

应用程序图标

例如Windows的任务栏,Android的桌面对每个程序都有一个应用程序图标。

app对此提供X/SetX风格的API来获取/设置。

方法签名是

	Icon() Resource
	SetIcon(Resource)

Resource也是一个接口,有两个方法获取资源名和资源内容([]byte)。

事件循环

Run方法启动UI渲染等的事件循环,Quit方法结束事件循环并正常关闭所有Window退出。

注意Quit在移动设备会终止事件循环,从前使得页面无响应,但不会退出。

系统相关

发送通知

a.SendNotification(fyne.NewNotification("title", "content"))

可以发出一个系统通知,在windows是右下角小卡片的Toast通知,在安卓是悬浮通知和状态栏通知。

剪切板

a.Clipboard().Content() // string type

可以获取系统剪切板的内容

Clipboard返回值也是一个X/SetX风格方法的接口,所以也可以设置剪切板内容。

文件操作

a.Storage()

返回一个支持对系统文件进行打开,读写,创建,删除等操作的接口。不过在电脑go std的os包也够用,似乎这个接口在移动设置更有用。

用户配置

Preferences方法返回一个接口,可以将自定义用户配置以键值对的json格式,存在系统用户目录里。

生命周期

Lifecycle方法返回一个接口,可以设置前后台切换与启动停止四种情况发生时的hook。

例如

	a.Lifecycle().SetOnStopped(func() {
		a.SendNotification(fyne.NewNotification("通知", "程序关闭"))
		time.Sleep(3 * time.Second)
	})

可以实现程序在退出前通知用户的效果。

还是一些方法不太实用,不做笔记。

Window

标题

Title也是一个X/SetX风格的方法,可以设置和获取通常窗口标题,Windows系统通常在左上角显示。

全屏

FullScreen也是一个X/SetX风格的方法,可以设置是否全屏并获取当前状态。

注意:在安卓窗口默认全屏。

大小

固定大小

FixedSize也是一个X/SetX风格的方法,可以设置和获取是否允许用户调整窗口大小。

调整大小

Resize方法可以调整窗口大小。

示例

w := a.NewWindow("Hello World")
w.Resize(fyne.NewSize(100,100))

布局

居中

CenterOnScreen可以将窗口放在屏幕正中间。

内边距

Padded也是一个X/SetX风格的方法,设置和获取窗口是否设置内边距,以防止组件与窗口边缘接触

SetMaster

这个方法指示当该窗口关闭时,App退出。

这也是一个X/SetX风格的方法,可以设置获取类似Vs Code那种屏幕顶部的,文件,编辑等顶级菜单。

完整示例

package main

import (
	"fmt"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)

func main() {
	// 1. 创建Fyne应用实例和窗口
	myApp := app.New()
	myWindow := myApp.NewWindow("Fyne Top Level Menu 示例")
	myWindow.Resize(fyne.NewSize(400, 300))

	// 2. 构造「文件」顶层菜单的菜单项
	// 新建:Label+Action回调
	itemNew := fyne.NewMenuItem("新建", func() {
		fmt.Println("点击了【文件】→【新建】")
	})
	// 保存:Label+Action回调
	itemSave := fyne.NewMenuItem("保存", func() {
		fmt.Println("点击了【文件】→【保存】")
	})
	// 退出:Label+Action回调(关闭应用)
	itemQuit := fyne.NewMenuItem("退出", func() {
		myApp.Quit()
	})
	// 构造「文件」顶层菜单:fyne.NewMenu(菜单名称, 菜单项1, 菜单项2, ...)
	menuFile := fyne.NewMenu("文件", itemNew, itemSave, itemQuit)

	// 3. 构造「编辑」顶层菜单的菜单项
	itemCopy := fyne.NewMenuItem("复制", func() {
		fmt.Println("点击了【编辑】→【复制】")
	})
	itemPaste := fyne.NewMenuItem("粘贴", func() {
		fmt.Println("点击了【编辑】→【粘贴】")
	})
	// 构造「编辑」顶层菜单
	menuEdit := fyne.NewMenu("编辑", itemCopy, itemPaste)

	// 4. 构造根菜单(主菜单)并设置为应用的顶层菜单
	// fyne.NewMainMenu(顶层菜单1, 顶层菜单2, ...):专门用于创建顶层菜单的根容器
	mainMenu := fyne.NewMainMenu(menuFile, menuEdit)

	// 5. 设置窗口内容并运行
	content := container.NewVBox(widget.NewLabel("Fyne顶层菜单示例:点击窗口顶部的菜单试试!"))
	myWindow.SetContent(content)
	myWindow.SetMainMenu(mainMenu)
	myWindow.ShowAndRun()
}

通过

if desk, ok := a.(desktop.App); ok { // "fyne.io/fyne/v2/driver/desktop"
		desk.SetSystemTrayMenu(menuFile)
	}

还可以设置系统托盘菜单,仅限桌面操作系统。

关闭hook

SetOnClosedSetCloseIntercept设置hook在窗口已关闭与窗口被点击右上角X后时运行。

SetCloseIntercept使用这个方法,如果想单独关闭窗口,必须自行调用Window.Close方法。

显示操作

ShowHideCloseShowAndRun四个方法就像字面意思那样改变窗口的显示情况。

Content也是一个X/SetX风格的方法,处理显示的内容。

Canvas提供绘图的画布上下文,可以利用它为窗口设置按键处理程序等。

Tags:
Categories: