fyne是基于go编写的GUI库,可以运行在桌面端和移动端,样式风格使用的是Material Design,其github地址是https://github.com/fyne-io/fyne
本文主要讲述如何在Windows下初步使用fyne
一 安装
1. 安装golang
版本要大于1.12,这个网上各种教程,可以自行搜索。
2. 安装fyne
去地址https://github.com/fyne-io/fyne/releases下载最新release的fyne版本,本文写作时最新版是1.24,下载好之后,解压,总共也就30M左右,
把文件夹fyne-1.24改成fyne,接着在go的安装路径C:\Go\src下新建一个文件夹叫fyne-io,然后把fyne文件夹拷贝到fyne-io里
3. 安装64位MinGW
官网说由于fyne需要使用gcc去和系统的显卡驱动进行通信,所以需要安装gcc,win下使用MinGW就可以了。
可以去这个地址https://jmeubank.github.io/tdm-gcc/download/下载64位MinGW进行安装。
本人由于安装了CodeBlocks 20.03,顺带已经安装了MinGW,所以只需要把MinGW下bin路径添加到系统变量里去就行了。
二 简单使用
安装完毕后,就可以来简单体验一下fyne,简单例子main.go如下,
// main.go
package main
import (
"fyne.io/fyne/widget"
"fyne.io/fyne/app"
)
func main() {
app := app.New()
w := app.NewWindow("Hello")
w.SetContent(widget.NewVBox(
widget.NewLabel("Hello Fyne!"),
widget.NewButton("Quit", func() {
app.Quit()
}),
))
w.ShowAndRun()
}
在命令行下使用命令go run main.go,结果如下,
这样就运行成功了,第一次运行会很慢,估计是在使用MinGW编译某些程序,后面就很快了。
复杂一点的例子如下,
// Package main provides various examples of Fyne API capabilities
package main
import (
"fmt"
"net/url"
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/canvas"
"fyne.io/fyne/cmd/fyne_demo/data"
"fyne.io/fyne/cmd/fyne_demo/screens"
"fyne.io/fyne/layout"
"fyne.io/fyne/theme"
"fyne.io/fyne/widget"
)
const preferenceCurrentTab = "currentTab"
func parseURL(urlStr string) *url.URL {
link, err := url.Parse(urlStr)
if err != nil {
fyne.LogError("Could not parse URL", err)
}
return link
}
func welcomeScreen(a fyne.App) fyne.CanvasObject {
logo := canvas.NewImageFromResource(data.FyneScene)
logo.SetMinSize(fyne.NewSize(228, 167))
return widget.NewVBox(
widget.NewLabelWithStyle("Welcome to the Fyne toolkit demo app", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}),
layout.NewSpacer(),
widget.NewHBox(layout.NewSpacer(), logo, layout.NewSpacer()),
widget.NewHBox(layout.NewSpacer(),
widget.NewHyperlink("fyne.io", parseURL("https://fyne.io/")),
widget.NewLabel("-"),
widget.NewHyperlink("documentation", parseURL("https://fyne.io/develop/")),
widget.NewLabel("-"),
widget.NewHyperlink("sponsor", parseURL("https://github.com/sponsors/fyne-io")),
layout.NewSpacer(),
),
layout.NewSpacer(),
widget.NewGroup("Theme",
fyne.NewContainerWithLayout(layout.NewGridLayout(2),
widget.NewButton("Dark", func() {
a.Settings().SetTheme(theme.DarkTheme())
}),
widget.NewButton("Light", func() {
a.Settings().SetTheme(theme.LightTheme())
}),
),
),
)
}
func main() {
a := app.NewWithID("io.fyne.demo")
a.SetIcon(theme.FyneLogo())
w := a.NewWindow("Fyne Demo")
w.SetMainMenu(fyne.NewMainMenu(fyne.NewMenu("File",
fyne.NewMenuItem("New", func() { fmt.Println("Menu New") }),
// a quit item will be appended to our first menu
), fyne.NewMenu("Edit",
fyne.NewMenuItem("Cut", func() { fmt.Println("Menu Cut") }),
fyne.NewMenuItem("Copy", func() { fmt.Println("Menu Copy") }),
fyne.NewMenuItem("Paste", func() { fmt.Println("Menu Paste") }),
)))
w.SetMaster()
tabs := widget.NewTabContainer(
widget.NewTabItemWithIcon("Welcome", theme.HomeIcon(), welcomeScreen(a)),
widget.NewTabItemWithIcon("Widgets", theme.ContentCopyIcon(), screens.WidgetScreen()),
widget.NewTabItemWithIcon("Graphics", theme.DocumentCreateIcon(), screens.GraphicsScreen()),
widget.NewTabItemWithIcon("Windows", theme.ViewFullScreenIcon(), screens.DialogScreen(w)),
widget.NewTabItemWithIcon("Advanced", theme.SettingsIcon(), screens.AdvancedScreen(w)))
tabs.SetTabLocation(widget.TabLocationLeading)
tabs.SelectTabIndex(a.Preferences().Int(preferenceCurrentTab))
w.SetContent(tabs)
w.ShowAndRun()
a.Preferences().SetInt(preferenceCurrentTab, tabs.CurrentTabIndex())
}
再次运行,可以看到如下界面,暗黑模式,
点击右下的Light可以切换到明亮模式,
其它地方也可以点点,看看fyne提供的部件。
三 总结
总体来说,fyne还是不错的,本文写作时github上star是9.5k,已经算是比较高了。由于go主打server开发,gui方面相对比较薄弱,而fyne正好在这方面进行弥补一下。
个人感觉其优点是小巧,只有30M左右,在构建中小型方面应该是没问题的,而且GUI都需要一个后台来处理UI上的各种事件,正好是go擅长的,可以无缝衔接。不过与QT相比还是差距比较大的,但是QT现在越来越庞大了…
如果有写的不对的地方,希望能留言指正,谢谢阅读。