初体验Go的GUI框架

首先安装好Go和mingw编译器并配置完成

1
2
$ go version
$ g++ -v

安装Fyne框架

1
2
$ go mod init test
$ go get fyne.io/fyne/v2

编写HelloWorld

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
package main

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

func main() {
a := app.New()
w := a.NewWindow("Go gogo")
hello := widget.NewLabel("Hello Fyne!")
w.SetContent(container.NewVBox(
hello,
widget.NewButton("Hi!", func() {
hello.SetText("Welcome :)")
}),
))
w.Resize(fyne.NewSize(400, 200))
w.ShowAndRun()
}

运行

1
2
$ go mod tidy # 清理 go.mod 文件,移除不需要的依赖,确保使用的依赖在文件中声明
$ go run . # 表示运行所有 package main 的 go文件

第一次编译可能需要时间较长

运行结果

运行结果

初体验的后进阶测试

那么如何去实现日常使用程序中的点击按钮打开新窗口的操作呢?

如果你不是小白的话,通过上述例子已经能举一反三自己完成了。

注意到 widget.NewButton("Hi!", func() { hello.SetText("Welcome :)") }), 这个元素内的内容,里面定义了一个回调函数,因此我们可以在这里去实现相关操作。

main.go
1
2
3
4
5
6
7
8
9
w.SetContent(container.NewVBox(
hello,
widget.NewButton("Hi!", func() {
- hello.SetText("Welcome :)")
+ wt := a.NewWindow("新窗口")
+ wt.SetContent(widget.NewLabel("这是新窗口的内容"))
+ wt.Show()
}),
))

如果出现中文乱码,可以通过更改字体样式来解决。

效果

点击按钮后效果

进一步使用Fyne框架进行交互操作

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
27
28
29
30
31
32
33
34
35
36
37
38
39
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() {
a := app.New()
w := a.NewWindow("Go gogo")

// 这里使用一个函数将UI抽离出逻辑流,接收返回的组件指针
w.SetContent(container.NewVBox(makeUI()))

w.Resize(fyne.NewSize(400, 200))
w.ShowAndRun()
}

func makeUI() (*widget.Label, *widget.Entry, *widget.Button, *widget.Label, *widget.Button) {
// 这个实现的是将输入框的内容显示在标签上
output := widget.NewLabel("Hello World")
entry := widget.NewEntry()
btn := widget.NewButton("Click", func() {
output.SetText(entry.Text)
})

// 这个是实现点击增加数字
number := 0
count := widget.NewLabel(fmt.Sprintf("Current Number: %d", number))
incrementBtn := widget.NewButton("Add", func() {
number++
count.SetText(fmt.Sprintf("Current Number: %d", number))
})
return output, entry, btn, count, incrementBtn
}

container.NewVBox 接收组件和其指针,并将组件垂直的渲染出来

实现效果

效果图