Fyne ( go跨平台GUI )中文文档-小部件 (五)
本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法
go代码展示为Go 1.16
及更高版本, ide
为goland2021.2
这是一个系列文章:
Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客
Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客
Fyne ( go跨平台GUI )中文文档-绘图和动画(三)-CSDN博客
Fyne ( go跨平台GUI )中文文档-容器和布局 (四)-CSDN博客
Fyne ( go跨平台GUI )中文文档-小部件 (五)-CSDN博客
Fyne ( go跨平台GUI )中文文档- 数据绑定 (六)-CSDN博客
Fyne ( go跨平台GUI )中文文档- 扩展Fyne (七)-CSDN博客
Fyne ( go跨平台GUI )中文文档- 架构 (八)完结-CSDN博客
5. 小部件
5.1 标签(Label)
小部件是 Fyne
应用程序 GUI
的主要组件,它们可以在fyne.CanvasObject
可以使用的任何地方使用。他们管理用户交互,并将始终匹配当前主题。Label
小部件是其中最简单的——它向用户呈现文本。不像canvas.Text
它可以处理一些简单的格式(例如\n)和换行(通过设置Wrapping
字段)。您可以通过调用创建标签widget.NewLabel("some text")
,结果可以分配给变量或直接传递给容器。
package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget"
)func main() {myApp := app.New()myWindow := myApp.NewWindow("Label Widget")content := widget.NewLabel("text")myWindow.SetContent(content)myWindow.ShowAndRun()
}
5.2 按钮
按钮小部件可以包含文本、图标或两者,构造函数是widget.NewButton()
和widget.NewButtonWithIcon()
。要创建一个文本按钮,只有 2 个参数,string内容和一个func()在点击按钮时将调用的 0 参数。请参阅示例以了解如何创建它。
带有图标的按钮构造函数包括一个附加参数,该参数fyne.Resource包含图标数据。包中的内置图标theme都可以适当地适应主题的变化。如果它作为资源加载,您可以传入您自己的图像 -fyne.LoadResourceFromPath()
尽管可能会建议捆绑资源,但可能会提供帮助等帮助程序。
要创建一个只有图标的按钮,您应该将“”作为标签参数传递给widget.NewButtonWithIcon()
.
package mainimport ("log""fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget"//"fyne.io/fyne/v2/theme"
)func main() {myApp := app.New()myWindow := myApp.NewWindow("Button Widget")content := widget.NewButton("click me", func() {log.Println("tapped")})//content := widget.NewButtonWithIcon("Home", theme.HomeIcon(), func() {// log.Println("tapped home")//})myWindow.SetContent(content)myWindow.ShowAndRun()
}
5.3 输入框(Entry)
条目小部件用于简单文本内容的用户输入。可以使用简单的widget.NewEntry()
构造函数创建条目。当您创建小部件时,请保留一个参考,以便您Text
以后可以访问其字段。也可以使用OnChanged
回调函数在每次内容变化时得到通知。
条目小部件还可以验证输入的文本输入。这可以通过将Validator
字段设置为 a来完成fyne.StringValidator
。您还可以设置PlaceHolder
文本并将条目设置MultiLine
为接受多行文本。
package mainimport ("log""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/widget"
)func main() {myApp := app.New()myWindow := myApp.NewWindow("Entry Widget")input := widget.NewEntry()input.SetPlaceHolder("Enter text...")content := container.NewVBox(input, widget.NewButton("Save", func() {log.Println("Content was:", input.Text)}))myWindow.SetContent(content)myWindow.ShowAndRun()
}
NewPasswordEntry()
您还可以使用该功能创建密码条目(内容被隐藏的地方) 。
5.4 选项(Choices)
有多种小部件可用于向用户提供选择,其中包括复选框、单选组和选择弹出窗口。widget.Check
提供了一个简单的是/否选择,并使用字符串标签创建。这些小部件中的每一个也接受“更改” func(...)
,其中参数是适当的类型。widget.NewCheck(..)
在此为标签提供string参数,为更改事件提供func(bool)
参数。您还可以使用该Checked字段来获取布尔值。radio
小部件类似,但第一个参数是string代表每个选项的string
切片。change
函数string这次需要一个参数来返回当前选择的值。调用widget.NewRadioGroup(...)
构造单选组小部件,您可以稍后使用此引用来读取Selected字段,而不是使用更改回调。
选择小部件在构造函数签名中与单选小部件相同。调用widget.NewSelect(...)
将改为显示一个按钮,该按钮在点击时显示一个弹出窗口,用户可以从中进行选择。这对于较长的选项列表更好。
package mainimport ("log""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/widget"
)func main() {myApp := app.New()myWindow := myApp.NewWindow("Choice Widgets")check := widget.NewCheck("Optional", func(value bool) {log.Println("Check set to", value)})radio := widget.NewRadioGroup([]string{"Option 1", "Option 2"}, func(value string) {log.Println("Radio set to", value)})combo := widget.NewSelect([]string{"Option 1", "Option 2"}, func(value string) {log.Println("Select set to", value)})myWindow.SetContent(container.NewVBox(check, radio, combo))myWindow.ShowAndRun()
}
5.5 表单(Form)
表单小部件用于布置许多带有标签的输入字段以及可选的取消和提交按钮。在其最简单的形式中,它将标签对齐到每个输入小部件的左侧。通过设置 OnCancel
或 OnSubmit
,表单将添加一个按钮栏,并在适当时调用指定的处理程序。
可以通过widget.NewForm(...)
传递widget.FormItem
列表或使用&widget.Form{}
来创建小部件。还有一个有用Form.Append(label
, widget)的可用于替代语法。
在此示例中,我们创建了两个条目,其中一个是“多行”(如HTML
TextArea
)来保存值。有一个 OnSubmit
处理程序在关闭窗口(以及应用程序)之前打印信息。
package mainimport ("log""fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget"
)func main() {myApp := app.New()myWindow := myApp.NewWindow("Form Widget")entry := widget.NewEntry()textArea := widget.NewMultiLineEntry()form := &widget.Form{Items: []*widget.FormItem{ // we can specify items in the constructor{Text: "Entry", Widget: entry}},OnSubmit: func() { // optional, handle form submissionlog.Println("Form submitted:", entry.Text)log.Println("multiline:", textArea.Text)//myWindow.Close()},}// we can also append itemsform.Append("Text", textArea)myWindow.SetContent(form)myWindow.ShowAndRun()
}
5.6 进度条
进度条小部件有两种形式,标准进度条显示Value已到达的用户,从Min
到 Max
。默认最小值为0.0
,最大值默认为1.0
。要使用默认值,只需调用widget.NewProgressBar()
. 创建后,您可以设置Value字段。
要设置自定义范围,您可以手动设置Min和字段。Max标签将始终显示完成百分比。
进度小部件的另一种形式是无限进度条。这个版本通过从左到右再向后移动栏的一部分来简单地显示一些活动正在进行。您使用它创建widget.NewProgressBarInfinite()
它,它会在显示后立即开始动画。
package mainimport ("time""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/widget"
)func main() {myApp := app.New()myWindow := myApp.NewWindow("ProgressBar Widget")progress := widget.NewProgressBar()infinite := widget.NewProgressBarInfinite()go func() {for i := 0.0; i <= 1.0; i += 0.1 {time.Sleep(time.Millisecond * 250)progress.SetValue(i)}}()myWindow.SetContent(container.NewVBox(progress, infinite))myWindow.ShowAndRun()
}
5.7 工具栏
工具栏小部件创建一行操作按钮,使用图标来表示每个按钮。构造widget.NewToolbar(...)
函数接受widget.ToolbarItem
参数列表。工具栏项的内置类型是操作、分隔符和间隔符。
最常用的项目是使用该 widget.NewToolbarItemAction(..)
函数创建的操作。一个动作有两个参数,第一个是要绘制的图标资源,后者是func()
点击时调用的资源。这将创建一个标准工具栏按钮。
您可以使用widget.NewToolbarSeparator()
在工具栏中的项目之间创建一个小的分隔线(通常是一条细垂直线)。最后,您可以使用widget.NewToolbarSpacer()
在元素之间创建灵活的空间。这对于右对齐在分隔符之后列出的工具栏项非常有用。
工具栏应始终位于内容区域的顶部,因此fyne.Container
使用 将其添加到layout.BorderLayout
其他内容上方是正常的。
package mainimport ("log""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/theme""fyne.io/fyne/v2/widget"
)func main() {myApp := app.New()myWindow := myApp.NewWindow("Toolbar Widget")toolbar := widget.NewToolbar(widget.NewToolbarAction(theme.DocumentCreateIcon(), func() {log.Println("New document")}),widget.NewToolbarSeparator(),widget.NewToolbarAction(theme.ContentCutIcon(), func() {}),widget.NewToolbarAction(theme.ContentCopyIcon(), func() {}),widget.NewToolbarAction(theme.ContentPasteIcon(), func() {}),widget.NewToolbarSpacer(),widget.NewToolbarAction(theme.HelpIcon(), func() {log.Println("Display help")}),)content := container.NewBorder(toolbar, nil, nil, nil, widget.NewLabel("Content"))myWindow.SetContent(content)myWindow.ShowAndRun()
}
5.8 列表
该List
小部件是工具包的集合小部件之一。这些小部件旨在帮助在呈现大量数据时构建真正高性能的界面。您还可以看到具有类似 API的表和小部件。Tree
由于这种设计,它们使用起来有点复杂。
使用List回调函数在需要时请求数据。有 3 个主要回调Length
,CreateItem
和UpdateItem
。Length
回调(首先传递)是最简单的,它返回要呈现的数据中有多少项。其他与模板有关——如何创建、缓存和重用图形元素。
回调返回一个新的CreateItem
模板对象。当显示小部件时,这将与真实数据一起使用。该MinSize
对象的 将影响List
最小尺寸。最后UpdateItem
调用将数据项应用到缓存的模板。使用它来设置准备显示的内容。
package mainimport ("fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget"
)var data = []string{"a", "string", "list"}func main() {myApp := app.New()myWindow := myApp.NewWindow("List Widget")list := widget.NewList(func() int {return len(data)},func() fyne.CanvasObject {return widget.NewLabel("template")},func(i widget.ListItemID, o fyne.CanvasObject) {o.(*widget.Label).SetText(data[i])})myWindow.SetContent(list)myWindow.ShowAndRun()
}
5.9 表格
Table
部件就像List
具有二维索引的小部件(工具包的另一个集合小部件)。这样List
的设计旨在帮助在呈现大量数据时构建真正高性能的界面。因此,小部件不是在创建时嵌入所有数据,而是在需要时调用数据源。
使用Table
回调函数在需要时请求数据。有3
个主要回调Length
,CreateCell
和UpdateCell
。Length
回调(首先传递)是最简单的,它返回要呈现的数据中有多少项,它返回的两个整数代表行数和列数。另外两个与内容模板有关。
回调返回一个新的CreateCell
模板对象,就像列表一样。不同之处在于MinSize
它将定义每个单元格的标准大小和表格的最小大小(它至少显示一个单元格)。如前所述,UpdateCell
调用将数据应用到单元格模板。传入的索引是相同的(row, col)int
对。
package mainimport ("fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget"
)var data = [][]string{[]string{"top left", "top right"},[]string{"bottom left", "bottom right"}}func main() {myApp := app.New()myWindow := myApp.NewWindow("Table Widget")list := widget.NewTable(func() (int, int) {return len(data), len(data[0])},func() fyne.CanvasObject {return widget.NewLabel("wide content")},func(i widget.TableCellID, o fyne.CanvasObject) {o.(*widget.Label).SetText(data[i.Row][i.Col])})myWindow.SetContent(list)myWindow.ShowAndRun()
}
相关文章:

Fyne ( go跨平台GUI )中文文档-小部件 (五)
本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…...

GUI编程19:贪吃蛇小游戏及GUI总结
视频链接:21、贪吃蛇之界面绘制_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p21&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.游戏中用的的图片素材 1.贪吃蛇游戏的主启动类StartGame; package com.yundait.snake;import j…...

linux StarRocks 安装
一、检查服务器是否支持avx2,如果执行命令显示空,则不支持,那么安装后无法启动BE cat /proc/cpuinfo |grep avx2我的支持显示如下: 二、安装 docker run -p 9030:9030 -p 8030:8030 -p 8040:8040 -p 9001:9000 --privilegedtrue…...

解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列
解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列 问题发现问题解决方法一:只监听死信队列,在死信队列里面处理业务逻辑方法二:修改预取值 问题发现 最近再学习RabbitMQ过程中,看到关于死信队列内容: 来自队…...

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标
chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标 今天打开电脑的时候,网页中任何文本的地方,只要鼠标点击,就会出现一个输入的光标,无论在哪个站点哪个页面都是如此。 我知道…...

使用python操作数据库
文章目录 一、问题背景二、安装python三、代码示例四、总结 一、问题背景 在日常开发过程中,随着项目进展和业务功能的迭代,我们需要对数据库的表结构进行修改,向部分表中追加字段,并对追加后的字段进行数据填充。但是如果需要追加…...

[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

排序----数据结构
Comparable Integer Double 默认情况下都是按照升序排列的 string 按照字母再ASCII码表中对应的数字升序进行排列 冒泡排序 时间复杂度O(x^2) 选择排序 时间复杂度O(x^2) 插入排序 时间复杂度O(x^2) 希尔排序 时间复杂度O(x) 归并排序 时间复杂度O(nlogn) 快速排序...

Crack道路裂缝检测数据集——目标检测数据集
【Crack道路裂缝检测数据集】共3684张。 目标检测数据集,标注文件为YOLO适用的txt格式。已划分为训练、验证集。 图片分辨率:224*224 类别:crack Crack道路裂缝检测数据集 数据集描述 该数据集是一个专门用于训练和评估基于YOLO࿰…...

10.3拉普拉斯金字塔
实验原理 拉普拉斯金字塔(Laplacian Pyramid)是一种图像表示方法,常被用于图像处理和计算机视觉领域。它是基于高斯金字塔的一种变换形式,主要用于图像融合、图像金字塔的构建等场景。下面简要介绍拉普拉斯金字塔的基本原理。 高…...

redis为什么不使用一致性hash
Redis节点间通信时,心跳包会携带节点的所有槽信息,它能以幂等方式来更新配置。如果采用 16384 个插槽,占空间 2KB (16384/8);如果采用 65536 个插槽,占空间 8KB (65536/8)。 今天我们聊个知识点为什么Redis使用哈希槽而不是一致性…...

Vue.js与Flask/Django后端配合
Vue.js与Flask/Django后端配合 在现代Web开发领域,前后端分离已成为一种流行的架构模式。Vue.js作为一款轻量级、高性能的前端框架,与Flask或Django这样的后端框架相结合,可以构建出强大且可扩展的Web应用。本文将详细介绍如何将Vue.js与Fla…...

ESP32 入门笔记02: ESP32-C3 系列( 芯片ESP32-C3FN4) (ESP-IDF + VSCode)
ESP32-C3 系列的 芯片 / 模组 / 开发板 ESP32-C3-DevKitM-1是乐鑫一款搭载 ESP32-C3-MINI-1 或 ESP32-C3-MINI-1U 模组的入门级开发板(内置 ESP32-C3FH4 或 ESP32-C3FN4 芯片)。 板上模组大部分管脚均已引出至两侧排针,可根据开发实际需求&a…...

Vue主题色实现
主题色实现 情境 配置平台支持多个主题色的选择,用户可通过在配置平台选择项目主题色。前端项目在骨架屏加载页面获取配置信息,设置项目主题色,实现同个项目不同主题色渲染的需求 实现 1.定义主题色变量 不同主题色根据不同js文件划分定…...

ChartLlama: A Multimodal LLM for Chart Understanding and Generation论文阅读
原文链接:https://arxiv.org/abs/2311.16483 代码与数据集:https://tingxueronghua.github.io/ChartLlama/ 本文启发:文章提出利用GPT-4合成大量图表数据,这些数据包含各种图表类型,包含丰富的instruction data。然后…...

ByteCinema(1):用户的登录注册
文章目录 主要功能生成图形验证码redis滑动窗口操作限流0.限流设计的必要性1.原理2.代码(邮箱发验证码为例)3. 问题与解决高并发环境下redis操作的原子性过时数据的积累 续约token实现长期登录0.设计的出发点1.前置知识:JWT什么是 JWT?JWT 的…...

电力电网电线变电站输电线绝缘子无人机类数据集/农业植物病虫害类数据集/光伏板/工程煤矿矿场类数据集/道路类数据集
电力电网电线变电站输电线红外缺陷类数据集 传送门链接: 1.电线覆盖物检测数据集 气球风筝鸟巢 1300张 voc yol-CSDN博客 2.变电站可见光缺陷数据集数据集包含8376张巡检图像,带xml标签,共包含17类巡检标签!具体缺陷分类见下图!…...

深度学习之表示学习 - 引言篇
序言 在数据爆炸的今天,如何从纷繁复杂的信息中抽取有价值的知识,成为了人工智能领域亟待解决的核心问题。深度学习,作为机器学习的一个重要分支,以其强大的特征表示能力和自动化学习特性,引领了这场数据革命的浪潮。…...

Linux驱动开发 ——架构体系
只读存储器(ROM) 1.作用 这是一种非易失性存储器,用于永久存储数据和程序。与随机存取存储器(RAM)不同,ROM中的数据在断电后不会丢失,通常用于存储固件和系统启动程序。它的内容在制造时或通过…...

Django一分钟:lookupAPI详解,使用django orm生成高效的WHERE子句
一、Lookup API概述 Lookup API是Django用于构建数据库查询WHERE子句的API。 Lookup API的核心包含两部分: RegisterLookupMixin:为子类提供注册lookup的方法Query Expression API:一个接口,规定了可以被注册为lookup的类需要实…...

信息安全工程师(8)网络新安全目标与功能
前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要,它们不仅反映了网络安全领域的最新发展趋势,也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对: 目标:建立多层次、全方位的网络安全防…...

返利机器人在电商返利系统中的负载均衡实现
返利机器人在电商返利系统中的负载均衡实现 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊一聊如何在电商返利系统中实现返利机器人的负载均衡,尤其是在面对高并发和大量…...

MATLAB中typecast函数用法
目录 语法 说明 示例 将整数转换为相同存储大小的无符号整数 将 8 位整数转换为单精度 将 32 位整数转换为 8 位整数 将 8 位整数转换为 16 位整数 提示 typecast函数的功能是在不更改基础数据的情况下转换数据类型。 语法 Y typecast(X,type) 说明 Y typecast(X,…...

植物大战僵尸【源代码分享+核心思路讲解】
植物大战僵尸已经正式完结,今天和大家分享一下,话不多说,直接上链接!!!(如果大家在运行这个游戏遇到了问题或者bug,那么请私我谢谢) 大家写的时候可以参考一下我的代码思…...

变压器设备漏油数据集 voc txt
变压器设备漏油数据集 油浸式变压器通常采用油浸自冷式、油浸风冷式和强迫油循环三种冷却方式。该数据集采集于油浸式变压器的设备漏油情况,一般用于变电站的无人巡检,代替传统的人工巡检,与绝缘子的破损检测来源于同一课题。数据集一部分来自…...

算法练习题25——leetcode3279统计重新排列后包含另一个字符串的子字符串的数目(滑动窗口 双指针 哈希)
题目描述 解题思路 本题用到了滑动窗口 双指针 哈希 刚开始我是没读懂题的因为我笨 我想把我的思路说一下 左端不轻易缩小 只有找到跟word2匹配了 比如说abbcdd 遍历到c的时候才能匹配这个word2 对吧 那么之后加上以一个d或者俩d 都符合了 然后我们算完了 才能缩小左端 扩大…...

JavaEE: 深入探索TCP网络编程的奇妙世界(二)
文章目录 TCP核心机制TCP核心机制二: 超时重传为啥会丢包?TCP如何对抗丢包?超时重传的时间设定超时时间该如何确定? TCP核心机制 前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(一) 书接上文~ TCP核心机制二: 超时重传 在网络传输中,并不会一帆风顺,而是可能出现&qu…...

GPT1-GPT3论文理解
GPT1-GPT3论文理解 视频参考:https://www.bilibili.com/video/BV1AF411b7xQ/?spm_id_from333.788&vd_sourcecdb0bc0dda1dccea0b8dc91485ef3e74 1 历史 2017.6 Transformer 2018.6 GPT 2018.10 BERT 2019.2 GPT-2 2020…...

C/C++内存管理 ——
目录 五、C/C内存管理 1、C/C内存分布 2、C语言中动态内存管理方式:malloc/calloc/realloc/free 3、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 1.内置类…...

深度学习02-pytorch-04-张量的运算函数
在 PyTorch 中,张量(tensor)运算是核心操作之一,PyTorch 提供了丰富的函数来进行张量运算,包括数学运算、线性代数、索引操作等。以下是常见的张量运算函数及其用途: 1. 基本数学运算 加法运算:…...