Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Fyne 入门 指南

简介

Fyne是一个使用Go语言开发的跨平台GUI框架,它通过简单的API为开发现代桌面和移动应用提供了强大的工具。利用矢量图形和 Material Design,Fyne旨在构建美观、高性能的应用程序,支持自动缩放以适应不同屏幕尺寸和分辨率。

快速开始

安装教程

Fyne需要3个基本元素:Go工具(至少版本1.12)、一个C编译器(用于与系统图形驱动连接)和一个系统图形驱动。

Mac安装教程

已经安装xcode

  1. 使用Go模块
  2. 下载Fyne模块和辅助工具
1
2
3
4
go mod init MODULE_NAME

go get fyne.io/fyne/v2@latest
go install fyne.io/fyne/v2/cmd/fyne@latest

创建应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"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.ShowAndRun() // 显示应用UI
}

应用与主循环

图形用户界面(GUI)应用程序,需要运行一个事件循环(有时被称为运行循环),来处理用户交互和绘图事件。在Fyne中,通过使用App.Run()Window.ShowAndRun()函数启动。这些函数中必须有一个在你的main()函数代码末尾被调用。

一个应用程序应该只有一个运行循环,在代码中只调用Run()一次。

一个应用程序可以通过调用App.Quit()直接退出(移动应用不支持此功能)。一旦所有窗口都被关闭,应用程序也将退出。

在应用程序退出之前,执行Run()之后的函数将不会被调用。

更新GUI内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"time"

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

func updateTime(clock *widget.Label) {
formatted := time.Now().Format("Time: 03:04:05")
clock.SetText(formatted)
}

func main() {
a := app.New()
w := a.NewWindow("Clock")

clock := widget.NewLabel("")
updateTime(clock)

w.SetContent(clock)
go func() {
for range time.Tick(time.Second) {
updateTime(clock)
}
}()
w.ShowAndRun()
}

window窗口

窗口是使用App.NewWindow()创建的,并需要使用Show()函数来显示。

调用Window.Resize()方法来设置更大的尺寸。这个方法接受一个fyne.Size,其中包含使用设备独立像素的宽度和高度。

1
w.Resize(fyne.NewSize(100, 100))

设置一个窗口为“主窗口”,这样如果该窗口关闭,应用程序就会退出。要做到这一点,使用Window上的SetMaster()函数。

测试

main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

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

func SetUI() (*widget.Label, *widget.Entry) {
out := widget.NewLabel("hello world")
in := widget.NewEntry()

in.OnChanged = func(s string) {
out.SetText("hello " + s)
}
return out, in
}

func main() {
app := app.New()
window := app.NewWindow("test")

window.SetContent(container.NewVBox(SetUI()))
window.ShowAndRun()
}

ui_test.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fyne.io/fyne/v2/test"
"testing"
)

func TestSetUI(t *testing.T) {
out, in := SetUI()

test.Type(in, "Andy")
if out.Text != "hello Andy" {
t.Error("Incorrect user greeting")
}
}

打包

“fyne”应用有一个“package”命令可以自动处理这一切。只需指定目标操作系统和任何所需的元数据(如图标),就会生成适当的包。对于.icns或.ico图标转换将自动完成,所以只需提供.png文件 :)。

要在 macOS 上为 Windows 或liunx目标系统构建应用程序,需要进行交叉编译。

设置环境变量

Window
1
2
3
export GOOS=windows
export GOARCH=amd64
export CC=x86_64-w64-mingw32-gcc
liunx
1
2
export GOOS=linux
export GOARCH=amd64

命令执行

1
2
3
4
5
fyne package -os darwin -icon myapp.png
fyne package -os linux -icon myapp.png
fyne package -os windows -icon myapp.png
// 安装
fyne install -icon myapp.png

从Fyne 2.1开始,使用 元数据文件,为项目设置默认选项。

元数据文件

支持一个元数据文件,允许在仓库中存储有关应用的信息。这个文件是可选的,但可以帮助避免在每个包和发布命令中记住特定的构建参数。

文件应该命名为FyneApp.toml,位于你运行fyne命令的目录中(通常是main包)。

1
2
3
4
5
6
7
8
Website = "https://example.com"

[Details]
Icon = "Icon.png"
Name = "My App"
ID = "com.example.app"
Version = "1.0.0"
Build = 1

文件的顶部部分是元数据,如果你将你的应用上传到https://apps.fyne.io列表页面时会使用,因此它是可选的。

[Details]部分包含了其他应用商店和操作系统在发布过程中使用的有关应用的数据。

如果找到了这个文件,fyne工具将会使用它,仍然可以使用命令行参数覆盖这些值。

评论