第一个fyne应用
由于在写一个milvus的图形化工具,方便客户端使用,调研了一下只有这fyne的go-gui的star最多,比较流行,因此打算使用这个框架来进行milvus的工具开发。
第一个fyne应用
依赖go.mod:
module fynedemogo 1.20require fyne.io/fyne/v2 v2.4.5
main.go
package mainimport ("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) WindowOpenURL(url *url.URL) errorIcon() ResourceSetIcon(Resource)Run()Quit()Driver() DriverUniqueID() stringSendNotification(*Notification)Settings() SettingsPreferences() PreferencesStorage() StorageLifecycle() LifecycleMetadata() AppMetadataCloudProvider() CloudProviderSetCloudProvider(CloudProvider)
}
图形应用的定义,应用程序可以有多个窗口,默认情况下,当所有窗口都关闭时,它们将退出。这可以使用SetMaster()或SetCloseIntercept()进行修改。要启动应用程序,您需要在main()函数中的某个位置调用Run()。注意是fyne.App的Run()。或者使用window.ShowAndRun()函数。
app.New()返回的是app.fyneApp结构体。
type fyneApp struct {driver fyne.Drivericon fyne.ResourceuniqueID stringcloud fyne.CloudProviderlifecycle fyne.Lifecyclesettings *settingsstorage fyne.Storageprefs fyne.Preferencesrunning 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() stringSetTitle(string)FullScreen() boolSetFullScreen(bool)Resize(Size)RequestFocus()FixedSize() boolSetFixedSize(bool)CenterOnScreen()Padded() boolSetPadded(bool)Icon() ResourceSetIcon(Resource)SetMaster()MainMenu() *MainMenuSetMainMenu(*MainMenu)SetOnClosed(func())SetCloseIntercept(func())SetOnDropped(func(Position, []URI))Show()Hide()Close()ShowAndRun()Content() CanvasObjectSetContent(CanvasObject)Canvas() CanvasClipboard() 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 {BaseWidgetText stringAlignment fyne.TextAlignWrapping fyne.TextWrapTextStyle fyne.TextStyleTruncation fyne.TextTruncationImportance Importanceprovider *RichTextbinder basicBinder
}
下面分析w.SetContent()
w.SetContent(label)
SetContent()设置窗口内容。
label是一个fyne.CanvasObject接口类型。
type CanvasObject interface {MinSize() SizeMove(Position)Position() PositionResize(Size)Size() SizeHide()Visible() boolShow()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等
- 显示窗口并运行