第一个fyne应用

第一个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等
  • 显示窗口并运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/705556.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka应用Demo: 抽取消费者公共处理代码并利用redis实现多消费者实例负载分担

问题描述 在项目中使用消息中间件,主要为实现两个目的: 任务排队:当请求过多时,消费端无法同时处理,需要排队等待。这一点kafka采用的是"拉取消息"的模式,自然支持。负载分担: 这里的负载负担不…

Benedict Evans:Ways to think about AGI思考 AGI 的方法:

​Benedict Evans本文发布于2024 年 5 月 4 日 How do we think about a fundamentally unknown and unknowable risk, when the experts agree only that they have no idea? 当专家们一致认为他们一无所知时,我们如何看待根本上未知和不可知的风险? T…

JVM学习-虚拟机栈

虚拟机栈 每个线程创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,对应一次次Java方法调用,栈是线程私有的。 生命周期: 与线程相同 作用 主管Java程序的运行,它保存方法的局部变量、部分结果、并参与方法的调用和返回。 …

【管理咨询宝藏104】普华永道财务管理与内控培训

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏104】普华永道财务管理与内控培训 【格式】PDF版本 【关键词】普华永道、四大、财务管理 【核心观点】 - 职能转变后,财务在决策支持…

亚马逊跨境电商平台优势凸显,武汉星起航解析助力卖家把握商机

在全球电商市场的激烈竞争中,亚马逊凭借其独特的优势和卓越的运营能力,成为众多卖家首选的跨境电商平台。武汉星起航作为深耕亚马逊跨境电商领域的领军企业,对亚马逊平台的优势有着深刻的理解和独到的见解。本文将重点探讨亚马逊跨境电商平台…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到H…

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂(上衣、下装)定义产品定义具体生产产品(上衣、下装) 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中,父类决定实例的生成方式,但…

牛客NC404 最接近的K个元素【中等 二分查找+双指针 Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/b4d7edc45759453e9bc8ab71f0888e0f 知识点 二分查找;找到第一个大于等于x的数的位置idx;然后从idx开始往两边扩展Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、…

UnitTest / pytest 框架

文章目录 一、UnitTest框架1. TestCase使用2. TestSuite 和 TestRunner3. TestLoader4. Fixture装置5. UnitTest断言1. 登录案例 6. 参数化1. parameterized插件 7. unitTest 跳过 二、pytest 框架1. 运行方式3.读取配置文件(常用方式) 2. pytest执行用例的顺序1. 分组执行(冒烟…

ArcGIS10.X入门实战视频教程(arcgis入门到精通)

点击学习: ArcGIS10.X入门实战视频教程(GIS思维)https://edu.csdn.net/course/detail/4046?utm_sourceblog2edu 点击学习: ArcGIS10.X入门实战视频教程(GIS思维)https://edu.csdn.net/course/detail/404…

【Python从入门到进阶】54、使用Python轻松操作SQLite数据库

一、引言 1、什么是SQLite SQLite的起源可以追溯到2000年,由D. Richard Hipp(理查德希普)所创建。作为一个独立的开发者,Hipp在寻找一个能够在嵌入式系统中使用的轻量级数据库时,发现现有的解决方案要么过于庞大&…

CAD插入文字到另一图形样式变相同

CAD从一张图形复制到另外一张图形后,文字样式变成一样是因为两张图所用的文字样式名称一样,但是样式里面的使用字体样式不一样。如下图所示,找到工具栏中的注释 ,点击文字样式。里面就会显示当前图形中使用的样式名称及其对应的字…