Fyne 系列 03:窗口、App 生命周期与事件
cbowen

Fyne 程序从 app.New() 开始,到 ShowAndRun() 进入事件循环。理解这个结构后,多窗口、关闭事件、后台任务都会清楚很多。

App 和 Window

1
2
3
a := app.New()
w := a.NewWindow("主窗口")
w.ShowAndRun()

app.App 表示整个应用,fyne.Window 表示一个窗口。一个应用可以创建多个窗口。

1
2
3
second := a.NewWindow("第二个窗口")
second.SetContent(widget.NewLabel("这是第二个窗口"))
second.Show()

主窗口使用 ShowAndRun(),其他窗口通常使用 Show()

设置关闭事件

窗口关闭前可以做一些清理工作:

1
2
3
4
5
6
7
w.SetCloseIntercept(func() {
dialog.ShowConfirm("退出", "确定要退出吗?", func(ok bool) {
if ok {
w.Close()
}
}, w)
})

这种写法适合在退出前提示保存配置、确认未完成任务等。

后台任务和界面更新

耗时操作不要直接放在按钮回调里阻塞界面。可以用 goroutine 执行后台任务,再回到主线程更新 UI。

1
2
3
4
5
6
7
8
9
10
11
12
button := widget.NewButton("开始", func() {
button.Disable()

go func() {
time.Sleep(2 * time.Second)

fyne.Do(func() {
button.Enable()
label.SetText("任务完成")
})
}()
})

界面控件不是普通的并发数据结构,后台 goroutine 里直接改 UI 很容易出现不稳定问题。把 UI 更新集中放回主线程,是写 Fyne 程序时需要养成的习惯。

常见窗口设置

1
2
3
w.Resize(fyne.NewSize(800, 500))
w.CenterOnScreen()
w.SetFixedSize(false)

Resize 设置初始大小,CenterOnScreen 居中显示,SetFixedSize 可以限制窗口是否允许调整大小。

桌面工具通常建议允许调整大小,然后通过布局系统适配窗口变化。

 评论
评论插件加载失败
正在加载评论插件