使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

news2024/9/21 11:10:49

引言

Fyne 是一个用 Go 语言编写的跨平台 GUI 框架,它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中,我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序,该程序包含设置标签文本和自增计数器的功能。

功能描述

本案例的应用程序将包含以下功能:

  • 一个文本标签 (Label),用于显示消息。
  • 一个文本输入框 (Entry),允许用户输入文本。
  • 一个按钮 (Button),当点击时,将输入框中的文本设置到标签上。
  • 一个显示计数的标签 (Label),显示当前的计数值。
  • 一个计数增加按钮 (Button),每次点击都会使计数加一,并更新显示的计数。
    在这里插入图片描述

完整代码实现

以下是使用 Fyne 编写的完整应用程序代码:

package main

import (
	"fmt"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
	"image/color"
	"log"
	"os"
)

// App 定义了应用程序的 UI 组件。
type App struct {
	Output       *widget.Label
	Entry        *widget.Entry
	Button       *widget.Button
	Count        *widget.Label
	IncrementBtn *widget.Button
}

// myTheme 定义了应用程序的自定义主题。
type myTheme struct {
	font fyne.Resource
}

// main 是程序的入口点,设置应用程序和 UI。
func main() {
	// 创建应用程序实例。
	appInstance := &App{}
	appInstance.setupUI()

	// 创建 Fyne 应用程序。
	myApp := app.New()
	// 加载自定义字体。
	customFont := fyne.NewStaticResource("NotoSansHans.ttf", loadFont("NotoSansHans-Regular.ttf"))
	myApp.Settings().SetTheme(&myTheme{font: customFont})

	// 创建窗口并设置内容。
	window := myApp.NewWindow("Fyne GUI Example")
	window.SetContent(container.NewVBox(
		appInstance.Output,
		appInstance.Entry,
		appInstance.Button,
		appInstance.Count,
		appInstance.IncrementBtn,
	))
	window.Resize(fyne.NewSize(300, 200))
	window.ShowAndRun()
}

// setupUI 初始化应用程序的 UI 组件。
func (app *App) setupUI() {
	// 初始化 UI 组件。
	app.Output = widget.NewLabel("Hello, Fyne!")
	app.Entry = widget.NewEntry()
	app.Button = widget.NewButton("Update Text", func() {
		app.Output.SetText(app.Entry.Text)
	})
	app.Button.Importance = widget.HighImportance

	// 初始化计数器和相关按钮。
	count := 0
	app.Count = widget.NewLabel(fmt.Sprintf("Current Count: %d", count))
	app.IncrementBtn = widget.NewButton("Increment", func() {
		count++
		app.Count.SetText(fmt.Sprintf("Current Count: %d", count))
	})
	app.IncrementBtn.Importance = widget.DangerImportance
}

// loadFont 加载字体文件为字节。
func loadFont(fontPath string) []byte {
	fontData, err := os.ReadFile(fontPath)
	if err != nil {
		log.Fatalf("Failed to load font file: %v", err)
	}
	return fontData
}

// 实现 myTheme 方法。
func (m *myTheme) Font(s fyne.TextStyle) fyne.Resource {
	return m.font
}
func (m *myTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
	return theme.DefaultTheme().Color(n, v)
}
func (m *myTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
	return theme.DefaultTheme().Icon(n)
}
func (m *myTheme) Size(n fyne.ThemeSizeName) float32 {
	return theme.DefaultTheme().Size(n)
}

代码解析

  1. App 结构体:包含了所有 UI 组件的字段。
  2. myTheme 结构体:用于自定义应用程序的主题,可以扩展以包含颜色、图标和尺寸的自定义。
  3. main 函数:程序的入口点,创建 App 实例,设置 UI,并启动 Fyne 应用程序。
  4. setupUI 方法:初始化并设置 UI 组件,包括文本标签、输入框、按钮和计数器。
  5. loadFont 函数:加载自定义字体文件。

结语

通过上述代码,我们展示了如何使用 Fyne 构建一个包含基本交互功能的 GUI 应用程序。Fyne 的组件和方法都非常简单直观,使得构建跨平台桌面应用变得容易。你可以使用本文中的代码作为起点,进一步扩展功能,发挥 Fyne 的强大功能来构建更复杂的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

按钮(Buttons)-Qt-思维导图-学习笔记

按钮(Buttons) 按钮在 Qt 中的重要性 按钮是 Qt 中最常用的控件之一 通过点击按钮,可以响应事件,实现人机交互效果 按钮在嵌入式系统和 PC 端的界面交互中都是不可或缺的 Qt 内置的六种按钮部件 QPushButton:下压按钮 用法示例 项目创建与…

指针详解(三)

目录 1. 数组名 2. 使用指针访问数组 3. 一维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟二维数组 1. 数组名 在使用指针访问数组的内容时,有这样的代码: int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];/…

CV党福音:YOLOv8实现实例分割(二)之训练过程

在上一篇博客中,我们已经了解了YOLOv8实例分割的基本流程,本章则是对数据集、以及训练过程等进行进一步的学习。 文章目录 训练整体流程语义分割与实例分割数据集开启训练训练Debug数据封装损失函数初始化前向传播 总结 训练整体流程 训练模型的整体流…

洗衣机洗衣服一些知识

01智能:按衣物多少自动调节合适水位的标准洗涤程序 (需要30分钟时间) 02:大物:较大,较厚的衣服洗涤 03:轻柔:毛织品或内衣洗涤 04:快速:少量清污衣服洗涤 (13分钟) 05:浸泡:先浸泡一段时间再洗涤 06:单洗:只洗衣不脱水 07:单脱:只脱水不洗衣 08:洁桶:清洁洗衣桶 准备工作: (1)…

XSS反射型和DOM型+DOM破坏

目录 第一关 源码分析 payload 第二关 源码分析 payload 第三关 源码分析 payload 第四关 源码分析 payload 第五关 源码分析 payload 第六关 源码分析 第七关 源码分析 方法一:构造函数 方法二:parseInt 方法三:locat…

龙门吊(天车)防撞方案

防撞雷达设备,是一款基于无线微波技术自主研发的应答式高精度无线防撞产品,该产品具有测距精度高(最高可到10厘米),测距稳定,无累计误差,粉尘、水汽不影响测距精度,抗电磁干扰等特点…

oracle数据库目录及文件

oracle数据库目录及文件 oracle安装后所有根目录 1、admin 目录 里边有不同文件夹,代表一个实例,记录 Oracle 实例的配置,运行日志等文件。每个实例一个目录。 SID:System IDentifier 的缩写,是 Oracle 实例的唯一标记…

IT服务标准化知识体系攻略(至简)

标准是为了在一定范围内获得最佳秩序 ,经协商一致制定并由公开机构批准共同使用和重复使用的和中规范性文件。标准是标准化活动的主要成果之一。国家标准的制定有一套正常程序,分为预阶段、立项阶段、起草阶段、征求意见阶段、审查阶段、批准阶段、出版阶…

【区块链+金融服务】第一创业证券开发银行间报价 Dapp | FISCO BCOS应用案例

在银行间市场现券交易的过程中,通过银保监会发牌的代理机构进行报价交易,已解决无代理阶段存在的许多问题。 但是由于业务需要,使用以前模式进行报价交易的仍占有一定比例。 针对这一现状,第一创业证券基于 FISCO BCOS 区块链底层…

工作 sql 数据库创建 表的修改 插入数据

一. 创建数据库 创建数据库 CREATE DATABASE (IF NOT EXISTS) 数据库名称;使用数据库 USE 数据库名称;查看当前数据库中存在的表 SHOW TABLES;删除数据库 DROP DATABASE demolibang 二. 创建表 格式: CREATE TABLE IF NOT EXISTS 表名( 字段名 字…

Unity动画模块 之 3D模型导入基础设置 Materials

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 还是那句话,用到的时候再看看,死记硬背不是正经的学习方法,但是又不得不知道一下&…

javaweb_10:XML映射文件

一、规范 1、XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放在相同的包下(同包同名)。 2、XML映射文件的namesapce属性为Mapper接口全限定名一致。 3、 XML映射文件中sql语句的id与Mapper接口中的方法名一致&a…

培训第二十七天(lvs_nat模式与lvs_dr模式配置)

上午 核心:内核中的ipvs,ipvsadm1、安装ipvsadm[rootnat ~]# yum -y install ipvsadm2、配置规则查看所有的规则,如果已经配置好规则,重启之后也就没有了[rootnat ~]# ipvsadm -L -n 1、配置vip网卡 (1)在…

数组前缀和算法技巧

一、什么是数组前缀和 数组中前缀和技巧(Prefix Sum Technique)是一种常见且有用的算法技巧,特别适用于需要频繁查询数组区间和的问题。这种技巧通过创建一个额外的数组来存储原始数组中特定位置之前所有元素的和,从而在需要计算…

【图论】并查集(Union-find Sets)

文章目录 前言一、并查集(Union-find Sets)基本概念基本操作步骤 二、并查集的操作步骤1. 初始化 init2. 查询 find、合并 union(未进行路径压缩)3. 查询 find、合并 union(路径压缩) 三、Kruskal 算法中 环 的判断并查集的使用 总…

C++中的string介绍(常用函数)

string类 为什么学习string类C语言中的字符串 标准库中的string类string类(了解)auto和范围forauto关键字范围for string类的常用接口说明(注意下面只讲解最常用的接口)string类对象的常见构造 string类对象的容量操作string类对象的访问及遍历操作string类对象的修改操作strin…

洛谷 P6280 [USACO20OPEN] Exercise G

题目来源于:洛谷 题目本质:dp,素数筛法,质数 本题与P4161基本一模一样 首先,分析题目发现,某个排列的需要进行恰好 K 步变回原样,这个时候K的值就是这个排序中各个环的长的的最小公倍数(lcm)。…

wechatAssetsPicker组件的用法

文章目录 1. 概念介绍2. 思路与方法2.1 使用思路2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"ImagePicker使用总结"相关的内容,本章回中将介绍wechat_assets_picker这个三方包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介…

红外遥控设计验证

前言 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机和手机系统中。本文…

位运算(1)

1.获取第i位的二进制数(只出现一次数字2): 2.将第i位的二进制设为1(只出现一次数字2): 3.int最低位为1的数(只出现一次数字3):