虽然图形界面开发不是 golang 的强项,但是再开发一些小应用的时候,作为 golang 的开发者可以不用使用其他语言就能开发图形界面的感觉还是很不错的,下面我们就来介绍下如何使用 golang 开发一个计算器图形界面应用。
golang 版本要求大于 1.14,需要安装 fyne 扩展包,需要 c 编译器,需要一些图形环境。
fyne 是一个由 golang 语言编写的一个 UI 图形库,它可以实现一套代码同时构建桌面应用和手机应用,目前它的最新版本已经来到了 2.2,并且添加了对 WASM 的支持。
sudo apt-get install golang gcc libgl1-mesa-dev xorg-dev
.go mod init
.go get fyne.io/fyne/v2
go mod tidy
.touch main.go
.fyne创建的应用程序的大致架构如下,首先,可以通过widget组件进行元素的创建,比如button,label等元素,其中对于元素的事件响应通过回调函数进行处理,然后,设置一个跟新界面的循环函数,里面是对界面的更新操作,最后,是将元素通过container容器进行布局,元素放到容器里面,可以进行行列的设置。最后,不要忘记设置窗口启动运行就行。
最终的代码如下:
package main
import (
"strconv"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"github.com/Knetic/govaluate"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Calculator")
mainResult := widget.NewLabel("")
mainS := ""
mainResult.SetText(mainS)
one := widget.NewButton("1", func() {
mainS += "1"
})
two := widget.NewButton("2", func() {
mainS += "2"
})
three := widget.NewButton("3", func() {
mainS += "3"
})
four := widget.NewButton("4", func() {
mainS += "4"
})
five := widget.NewButton("5", func() {
mainS += "5"
})
six := widget.NewButton("6", func() {
mainS += "6"
})
seven := widget.NewButton("7", func() {
mainS += "7"
})
eigth := widget.NewButton("8", func() {
mainS += "8"
})
nine := widget.NewButton("9", func() {
mainS += "9"
})
zero := widget.NewButton("0", func() {
mainS += "0"
})
clear := widget.NewButton("C", func() {
mainS = ""
})
plus := widget.NewButton("+", func() {
mainS += "+"
})
minus := widget.NewButton("-", func() {
mainS += "-"
})
multiply := widget.NewButton("*", func() {
mainS += "*"
})
divide := widget.NewButton("/", func() {
mainS += "/"
})
#fourth
equal := widget.NewButton("=", func() {
expression, err := govaluate.NewEvaluableExpression(mainS)
if err == nil {
result, err := expression.Evaluate(nil)
if err == nil {
mainS = strconv.FormatFloat(result.(float64), 'f', -1, 64)
} else {
mainS = err.Error()
}
} else {
mainS = err.Error()
}
})
#five updating it each time
go func() {
for {
mainResult.SetText(mainS)
}
}()
#creating layout from the given buttons
myWindow.SetContent(container.NewVBox(
mainResult,
container.NewGridWithColumns(3,
divide,
multiply,
minus,
// plus,
),
container.NewGridWithColumns(2,
container.NewGridWithRows(3,
container.NewGridWithColumns(3,
seven,
eigth,
nine,
),
container.NewGridWithColumns(3,
four,
five,
six,
),
container.NewGridWithColumns(3,
one,
two,
three,
),
),
plus,
),
container.NewGridWithColumns(2,
container.NewGridWithColumns(2,
clear,
zero,
),
equal,
),
),
)
myWindow.ShowAndRun()
}