赞
踩
Fyne 是一个使用 Go 编写的易于使用的 UI 工具包和应用程序 API。 它旨在构建使用单一代码库在桌面和移动设备上运行的应用程序。 2.3 版是 Fyne API 的当前版本,它添加了改进的主题设计、云存储、改进的国际语言文本处理和许多较小的功能添加。
github地址:https://github.com/fyne-io/fyne
要使用Fyne开发应用,你需要Go 1.14或更高版本,C编译器和系统开发工具。如果您不确定是否全部安装了,或者不知道如何安装,参考官方文档:https://developer.fyne.io/started/#prerequisites
使用标准的go工具,安装Fyne的核心库使用:
go get fyne.io/fyne/v2@latest
go install fyne.io/fyne/v2/cmd/fyne@latest
在编写应用程序代码或运行示例之前,您可以使用 Fyne 安装工具检查您的安装。只需从链接下载适合您计算机的应用程序并运行它,您应该会看到类似以下屏幕的内容:
如果您的安装有任何问题,请参阅故障排除部分以获取提示。
请注意,第一次运行必须编译一些 C 代码,因此可能需要比平时更长的时间。后续构建会重用缓存,速度会快很多。
go run fyne.io/fyne/v2/cmd/fyne_demo@latest
运行会自动下载相应的依赖:
运行结果, 看起来还不错:
更多详情可访问官方文档:https://developer.fyne.io/started/#run-the-demo
创建你的第一个Hello world程序:
main.go
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/widget"
)
func main() {
app := app.New() // 创建应用程序实例
window := app.NewWindow("Hello world") // 创建窗口,标题为"Hello Wolrd"
window.SetContent(widget.NewLabel("Hello world!")) // 往窗口中放入一个内容为"Hello world!"的标签控件
window.ShowAndRun() //展示并运行程序
}
一个简单的应用程序首先使用 app.New() 创建一个应用程序实例,然后使用 app.NewWindow() 打开一个窗口。然后定义了一个小部件树,它被设置为窗口上的 SetContent() 的主要内容。然后通过在窗口上调用 ShowAndRun() 来显示应用程序 UI。
上面的代码可以使用命令构建go build .,然后通过运行hello命令或双击图标来执行。您也可以绕过编译步骤,直接使用go run ..
两种方法都会显示一个如下所示的窗口:
如果您更喜欢浅色主题,则只需设置环境变量FYNE_THEME=light即可:
要使 GUI 应用程序正常工作,它需要运行一个事件循环(有时称为运行循环)来处理用户交互和绘图事件。在 Fyne 中,这是使用App.Run() 或Window.ShowAndRun()函数开始的。其中之一必须从函数中设置代码的末尾调用main()。
一个应用程序应该只有一个运行循环,因此您应该只Run()在代码中调用一次。第二次调用它会导致错误。
package main import ( "fmt" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/widget" ) func main() { myApp := app.New() myWindow := myApp.NewWindow("Hello") myWindow.SetContent(widget.NewLabel("Hello")) myWindow.Show() myApp.Run() tidyUp() } func tidyUp() { fmt.Println("运行成功") //程序退出后才会执行 }
对于桌面运行时,可以通过调用直接退出应用程序App.Quit() (移动应用程序不支持此功能)——通常在开发人员代码中不需要。一旦所有窗口关闭,应用程序也将退出。Run()另请参阅在应用程序退出之前不会调用之后执行的函数。
实现一个简单的时钟,在界面上显示时间。
第一步是将要更新的小部件分配给一个变量。widget.NewLabel 在我们直接传入的hello world 教程中SetContent(),为了更新它,我们将其更改为两行不同的代码,例如:
clock := widget.NewLabel("")
w.SetContent(clock)
一旦将内容分配给变量,我们就可以调用函数,例如SetText("new text"). 对于我们的示例,我们将在 的帮助下将标签的内容设置为当前时间 Time.Format。
formatted := time.Now().Format("Time: 03:04:05")
clock.SetText(formatted)
这就是我们更改可见项目的内容所需要做的一切(完整代码见下文)。但是,我们可以更进一步,定期更新内容。
大多数应用程序都需要有在后台运行的进程,例如下载数据或响应事件。为了模拟这一点,我们将扩展上面的代码以每秒运行一次。
与大多数 go 代码一样,我们可以创建一个 goroutine(使用关键字go )并在那里运行我们的代码。如果我们将文本更新代码移动到一个新函数中,它可以在初始显示时调用,也可以在计时器上调用以进行定期更新。通过结合一个 goroutine 和 time.Tick内部的 for 循环,我们可以每秒更新一次标签。
package main import ( "time" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/widget" ) func main() { app := app.New() // 创建应用程序实例 window := app.NewWindow("Hello world") // 创建窗口,标题为"Hello Wolrd" clock := widget.NewLabel("") updateTime(clock) go func() { for range time.Tick(time.Second) { updateTime(clock) // 每秒更新一次时间 } }() window.SetContent(clock) // 往窗口中放入一个内容为"Hello world!"的标签控件 window.ShowAndRun() //展示并运行程序 } func updateTime(clock *widget.Label) { formatted := time.Now().Format("Time: 03:04:05") //获取格式化时间 clock.SetText(formatted) }
效果如下:

窗口是使用该函数创建的App.NewWindow(),需要使用该Show()函数来显示。辅助方法ShowAndRun()onfyne.Window 允许您在显示窗口的同时运行应用程序。
默认情况下,窗口的大小将是正确的,以通过检查函数来显示其内容MinSize()(在后面的示例中会详细介绍)。您可以通过调用该方法设置更大的尺寸Window.Resize()。向其中传递一个 a fyne.Size,其中包含使用设备独立像素的宽度和高度(意味着它在不同设备上将是相同的),例如默认情况下使窗口为正方形我们可以:
w.Resize(fyne.NewSize(100, 100))
请注意,桌面环境可能具有导致窗口小于请求的限制。移动设备通常会忽略这一点,因为它们仅以全屏显示。
如果你想显示第二个窗口,你必须只调用该Show() 函数。 如果您想在应用程序启动时打开多个窗口,那么Window.Show()拆分也很有用。App.Run()下面的示例显示了如何在启动时加载两个窗口。
package main import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/widget" ) func main() { a := app.New() w := a.NewWindow("Hello World") w.SetContent(widget.NewLabel("Hello World!")) w.Show() w2 := a.NewWindow("Larger") w2.SetContent(widget.NewLabel("More content")) w2.Resize(fyne.NewSize(100, 100)) w2.Show() a.Run() }
当两个窗口都关闭时,上述应用程序将退出。如果你的应用程序被安排成一个窗口是主视图而其他窗口是附属视图,你可以将一个窗口设置为“主”窗口,以便在该窗口关闭时应用程序退出。为此,请使用SetMaster()on 上的功能Window。
窗口可以随时创建,我们可以更改上面的代码,让第二个窗口(w2)的内容是一个打开新窗口的按钮。您还可以从更复杂的工作流程加载窗口,但要小心,因为新窗口通常会出现在当前活动内容的上方。
w2.SetContent(widget.NewButton("Open new", func() {
w3 := a.NewWindow("Third")
w3.SetContent(widget.NewLabel("Third"))
w3.Show()
}))
完成代码如下:
package main import ( "time" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/widget" ) func main() { app := app.New() // 创建应用程序实例 window := app.NewWindow("Hello world") // 创建窗口,标题为"Hello Wolrd" clock := widget.NewLabel("") updateTime(clock) go func() { for range time.Tick(time.Second) { updateTime(clock) // 每秒更新一次时间 } }() window.SetContent(clock) // 往窗口中放入一个内容为"Hello world!"的标签控件 window.Show() //展示窗口1 window2 := app.NewWindow("Larger Window") window2.SetContent(widget.NewButton("Open New", func() { window3 := app.NewWindow("Third") window3.SetContent(widget.NewLabel("Third")) window3.Show() })) window2.Resize(fyne.NewSize(100, 100)) // 设置窗口大小 window2.Show() app.Run() } func updateTime(clock *widget.Label) { formatted := time.Now().Format("Time: 03:04:05") //获取格式化时间 clock.SetText(formatted) }
打包用于分发的图形应用程序可能很复杂。图形应用程序通常具有与之相关的图标和元数据,以及与每个环境集成所需的特定格式。Windows 可执行文件需要嵌入图标,macOS 应用程序是捆绑包,对于 Linux,应该安装各种元数据文件。好麻烦!
值得庆幸的是,“fyne”应用程序有一个“package”命令可以自动处理这个问题。只需指定目标操作系统和任何所需的元数据(例如图标)即可生成适当的包。.icns 或 .ico的图标转换将自动完成,因此只需提供一个 .png 文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。