第一个fyne应用
由于在写一个milvus的图形化工具,方便客户端使用,调研了一下只有这fyne的go-gui的star最多,比较流行,因此打算使用这个框架来进行milvus的工具开发。
第一个fyne应用
依赖go.mod:
module fynedemo
go 1.20
require fyne.io/fyne/v2 v2.4.5
main.go
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("golang")
label := widget.NewLabel("golang-tech-stack.com")
w.SetContent(label)
w.ShowAndRun()
}
第一次build会比较慢。
go build .
或者
go run main.go
图形界面:
代码分析
a := app.New()
app.New()返回类型fyne.App,返回一个使用默认驱动的应用实例,fyne.App是一个接口
type App interface {
NewWindow(title string) Window
OpenURL(url *url.URL) error
Icon() Resource
SetIcon(Resource)
Run()
Quit()
Driver() Driver
UniqueID() string
SendNotification(*Notification)
Settings() Settings
Preferences() Preferences
Storage() Storage
Lifecycle() Lifecycle
Metadata() AppMetadata
CloudProvider() CloudProvider
SetCloudProvider(CloudProvider)
}
图形应用的定义,应用程序可以有多个窗口,默认情况下,当所有窗口都关闭时,它们将退出。这可以使用SetMaster()或SetCloseIntercept()进行修改。要启动应用程序,您需要在main()函数中的某个位置调用Run()。注意是fyne.App的Run()。或者使用window.ShowAndRun()函数。
app.New()返回的是app.fyneApp结构体。
type fyneApp struct {
driver fyne.Driver
icon fyne.Resource
uniqueID string
cloud fyne.CloudProvider
lifecycle fyne.Lifecycle
settings *settings
storage fyne.Storage
prefs fyne.Preferences
running uint32 // atomic, 1 == running, 0 == stopped
}
driver的实例是glfw.gLDriver。
fyne.Driver是一个接口,有个2个实现:glfw.gLDriver和mobile.mobileDriver。glfw.gLDriver使用在桌面,mobile.mobileDriver使用在手机端。
下面分析NewWindow()
w := a.NewWindow("golang")
NewWindow()的返回的类型是fyne.Window,是一个接口。它的功能是为应用程序创建一个新窗口。打开的第一个窗口被视为“主窗口”,关闭后应用程序将退出。
type Window interface {
Title() string
SetTitle(string)
FullScreen() bool
SetFullScreen(bool)
Resize(Size)
RequestFocus()
FixedSize() bool
SetFixedSize(bool)
CenterOnScreen()
Padded() bool
SetPadded(bool)
Icon() Resource
SetIcon(Resource)
SetMaster()
MainMenu() *MainMenu
SetMainMenu(*MainMenu)
SetOnClosed(func())
SetCloseIntercept(func())
SetOnDropped(func(Position, []URI))
Show()
Hide()
Close()
ShowAndRun()
Content() CanvasObject
SetContent(CanvasObject)
Canvas() Canvas
Clipboard() Clipboard
}
fyne.Window有2个实现:glfw.window和mobile.window。
在本例中是glfw.window。
下面分析widget.NewLabel()
label := widget.NewLabel("golang-tech-stack.com")
NewLabel()使用设置的文本内容创建一个标签小部件。
NewLabel()返回widget.Label,是一个结构体。
type Label struct {
BaseWidget
Text string
Alignment fyne.TextAlign
Wrapping fyne.TextWrap
TextStyle fyne.TextStyle
Truncation fyne.TextTruncation
Importance Importance
provider *RichText
binder basicBinder
}
下面分析w.SetContent()
w.SetContent(label)
SetContent()设置窗口内容。
label是一个fyne.CanvasObject接口类型。
type CanvasObject interface {
MinSize() Size
Move(Position)
Position() Position
Resize(Size)
Size() Size
Hide()
Visible() bool
Show()
Refresh()
}
CanvasObject接口的实现就有widget.Label,还有widget.Button、widget.Check等。
下面分析w.ShowAndRun()
w.ShowAndRun()
ShowAndRun()是显示窗口然后运行应用程序的快捷方式。这应该在main()函数末尾调用,因为它会阻塞。
func (w *window) ShowAndRun() {
w.Show()
w.driver.Run()
}
总结
流程如下:
- 创建一个应用
- 创建一个窗口
- 设置内容,内容可以是label、button、check等
- 显示窗口并运行