第一个fyne应用

第一个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等
  • 显示窗口并运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shulu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值