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现在越来越庞大了…

如果有写的不对的地方,希望能留言指正,谢谢阅读。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐