Fyne ( go跨平台GUI )中文文档-入门(一)

news2024/12/30 11:02:53

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法
go代码展示为Go 1.16 及更高版本, idegoland2021.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博客

1.入门

1.1 介绍

基本环境

Fyne 需要存在 3 个基本元素,Go 工具(至少 1.12 版)、一个 C 编译器(用于连接系统图形驱动程序)和一个系统图形驱动程序。说明因您的操作系统而异,请选择下面的相应选项卡以获取安装说明。

请注意,这些步骤只是开发所必需的——您的 Fyne 应用程序不需要为最终用户进行任何设置或依赖安装!

window

  • MSYS2 与 MingW-w64 - msys2.org
  • Cygwin - cygwin.com

linux

  • Debian / Ubuntu: sudo apt-get install golang gcc libgl1-mesa-dev xorg-dev
  • Fedora: sudo dnf install golang gcc libXcursor-devel libXrandr-devel mesa-libGL-devel libXi-devel libXinerama-devel libXxf86vm-devel

下载安装

使用 Go 模块(Go 1.16 及更高版本需要)时,您需要先设置模块,然后才能使用包。如果您没有使用模块或者您已经初始化了模块,则可以跳过此步骤进行下一步。

#创建项目
cd myapp
go mod init MODULE_NAME
#下载 Fyne
go get fyne.io/fyne/v2

下载运行fyne演示 ( fyne_demo )

go run fyne.io/fyne/v2/cmd/fyne_demo
1.2 hello world

一个简单的应用程序首先使用 app.New()创建一个应用程序实例,然后使用app.NewWindow()打开一个窗口。然后定义一个小部件树,在窗口上使用SetContent()将其设置为主要内容。然后通过在窗口上调用ShowAndRun()来显示应用程序 UI。

package main

import (
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/widget"
)

func main() {
    a := app.New()
    w := a.NewWindow("Hello World")

    w.SetContent(widget.NewLabel("Hello World!"))
    w.ShowAndRun()
}

使用go run .查看效果
默认深色风格, 如果您更喜欢浅色主题,则只需设置环境变量FYNE_THEME=light

1.3 应用和事件 (RunLoop)

为了使GUI应用程序正常工作,它需要运行一个事件(有时称为runloop)来处理用户交互和绘图事件。在 Fyne 中,这是使用App.Run() orWindow.ShowAndRun()函数开始的。必须从main()函数中设置代码的末尾调用其中之一。
一个应用程序应该只有一个运行循环,因此您应该只Run()在代码中调用一次。再次调用它会导致错误。

package main

import (
    "fmt"

    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/widget"
)

func main() {
    myApp := app.New()
    myWindow := myApp.NewWindow("Hello")
    myWindow.SetContent(widget.NewLabel("Hello"))

    myWindow.Show()
    myApp.Run()
    tidyUp()
}

func tidyUp() {
    fmt.Println("Exited")
}

对于桌面运行时,可以通过调用直接退出App.Quit() 应用程序(移动应用程序不支持此功能) - 通常在开发人员代码中不需要。关闭所有窗口后,应用程序也将退出。另请参阅Run()在应用程序退出之前不会调用之后执行的函数。

1.4 更新内容

代码更新 GUI 的内容

//第一步是将要更新的小部件分配给变量。
clock := widget.NewLabel("")
w.SetContent(clock)
//将标签的内容设置为当前时间 Time.Format
formatted := time.Now().Format("Time: 03:04:05")
clock.SetText(formatted)

后台运行更新 GUI 的内容

大多数应用程序都需要在后台运行进程,例如下载数据或响应事件。为了模拟这一点,我们将扩展上面的代码以每秒运行一次。
与大多数 go 代码一样,我们可以创建一个 goroutine(使用go关键字)并在那里运行我们的代码。如果我们将文本更新代码移动到一个新函数中,它可以在初始显示以及定期更新的计时器上调用。通过结合 goroutine 和time.Tick内部的 for 循环,我们可以每秒更新标签。

    go func() {
        for range time.Tick(time.Second) {
            updateTime(clock)
        }
    }()

将此代码放在ShowAndRunRun调用之前很重要,因为它们在应用程序关闭之前不会返回。所有这些一起,代码将每秒运行并更新用户界面,创建一个基本的时钟小部件。完整代码如下:

package main

import (
    "time"

    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/widget"
)

func updateTime(clock *widget.Label) {
    formatted := time.Now().Format("Time: 03:04:05")
    clock.SetText(formatted)
}

func main() {
    a := app.New()
    w := a.NewWindow("Clock")

    clock := widget.NewLabel("")
    updateTime(clock)

    w.SetContent(clock)
    go func() {
        for range time.Tick(time.Second) {
            updateTime(clock)
        }
    }()
    w.ShowAndRun()
}

 

1.5 窗口处理

窗口是使用该函数创建的,App.NewWindow()并且需要使用该Show()函数显示。辅助方法ShowAndRun()onfyne.Window允许您同时显示窗口和运行应用程序。
默认情况下,窗口的大小将通过检查MinSize()函数来显示其内容(在后面的示例中会详细介绍)。Window.Resize()您可以通过调用该方法来设置更大的尺寸。传入fyne.Size其中包含使用设备独立像素的宽度和高度,例如,默认情况下使窗口为正方形,我们可以:

w.Resize(fyne.NewSize(100, 100))

请注意,桌面环境可能具有导致窗口小于请求的限制。移动设备通常会忽略这一点,因为它们仅全屏显示。
如果您希望显示第二个窗口,您只能调用该Show() 函数。 如果您想在应用程序启动时打开多个窗口Window.Show(),拆分也很有帮助。App.Run()下面的示例显示了如何在启动时加载两个窗口。

package main

import (
    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/widget"
)

func main() {
    a := app.New()
    w := a.NewWindow("Hello World")

    w.SetContent(widget.NewLabel("Hello World!"))
    w.Show()

    w2 := a.NewWindow("Larger")
    w2.SetContent(widget.NewLabel("More content"))
    w2.Resize(fyne.NewSize(100, 100))
    w2.Show()

    a.Run()
}

当两个窗口都关闭时,上述应用程序将退出。如果您的应用程序被安排成一个窗口是主窗口而其他窗口是辅助视图,您可以将一个窗口设置为“主”窗口,以便在该窗口关闭时应用程序退出。为此,请使用 上的SetMaster()功能Window
可以随时创建窗口,我们可以更改上面的代码,使第二个窗口 (w2) 的内容是一个打开新窗口的按钮。您还可以从更复杂的工作流程加载窗口,但要小心,因为新窗口通常会出现在当前活动内容之上。

    w2.SetContent(widget.NewButton("Open new", func() {
        w3 := a.NewWindow("Third")
        w3.SetContent(widget.NewLabel("Third"))
        w3.Show()
    }))
1.6 单元测试

Fyne 的 API 旨在简化测试应用程序。通过将组件逻辑与其渲染定义分离,我们可以加载应用程序而无需实际显示它们并完全测试功能。
我们可以通过扩展我们的Hello World 应用程序来演示单元测试,以包含空间供用户输入他们的名字以迎接问候。我们首先更新用户界面,使其具有两个元素,一个Label用于问候语,一个Entry用于名称输入。container.NewVBox我们使用(一个垂直的盒子容器)显示它们,一个在另一个之上。更新后的用户界面代码如下所示:

func makeUI() (*widget.Label, *widget.Entry) {
    return widget.NewLabel("Hello world!"),
        widget.NewEntry()
}

func main() {
    a := app.New()
    w := a.NewWindow("Hello Person")

    w.SetContent(container.NewVBox(makeUI()))
    w.ShowAndRun()
}

为了测试这个输入行为,我们创建了一个定义函数TestGreeter的新文件(名称结尾_test.go将其标记为测试) 。

package main

import (
    "testing"
)

func TestGreeting(t *testing.T) {
}

我们可以添加一个初始测试来验证初始状态,为此我们测试从 makeUI返回的 Label 的 Text字段和错误。 将以下代码添加到您的测试方法中:

    out, in := makeUI()

    if out.Text != "Hello world!" {
        t.Error("Incorrect initial greeting")
    }

该测试将通过 - 接下来我们添加到测试中以验证欢迎程序。我们使用辅助测试场景的 Fynefyne.io/fyne/v2/test包,调用test.Type模拟用户输入。以下测试代码将检查输入用户名时输出是否更新(请务必添加导入):

    test.Type(in, "Andy")
    if out.Text != "Hello Andy!" {
        t.Error("Incorrect user greeting")
    }

您可以使用 - 运行所有这些测试go test .,就像任何其他测试一样。这样做你现在会看到FAIL——因为我们没有添加欢迎逻辑。将函数更新makeUI为以下代码:

func makeUI() (*widget.Label, *widget.Entry) {
    out := widget.NewLabel("Hello world!")
    in := widget.NewEntry()

    in.OnChanged = func(content string) {
        out.SetText("Hello " + content + "!")
    }
    return out, in
}

这样做你会看到测试通过了。您还可以运行完整的应用程序(使用go run .)并在字段Entry中输入名称时查看问候语更新。另请注意,这些测试都在不显示窗口或窃取鼠标的情况下运行 - 这是Fyne单元测试设置的另一个好处。

1.7 打包

打包一个用于分发的图形应用程序可能很复杂。值得庆幸的是,“fyne”应用程序有一个“package”命令可以自动处理这个问题。只需指定目标操作系统和任何所需的元数据(例如图标)即可生成相应的包。.icns 或.ico 的图标转换将自动完成,因此只需提供一个.png文件 :)。

go install fyne.io/fyne/v2/cmd/fyne@latest
#macOS
fyne package -os darwin -icon myapp.png
#linux 和 Windows
fyne package -os linux -icon myapp.png
fyne package -os windows -icon myapp.png
1.8 移动端应用打包和分发

首先,您需要安装更多的开发工具来完成移动打包。adb对于 Android 构建,您必须安装 Android SDK 和 NDK 并设置适当的环境,以便可以在命令行上找到工具(例如)。要构建 iOS 应用程序,您需要在 macOS 计算机上安装 Xcode 以及命令行工具可选包。

fyne package -os android -appID com.example.myapp -icon mobileIcon.png
fyne package -os ios -appID com.example.myapp -icon mobileIcon.png

要在手机或模拟器上安装 android 应用程序,只需调用

adb install myapp.apk

要在iOS模拟器上安装,您可以使用如下命令行工具:

xcrun simctl install booted myapp.app

macOS 应用商店

先决条件:

  • 运行 macOS 和 Xcode 的 Apple mac
  • 苹果开发者账号
  • Mac App Store 应用证书
  • Mac App Store 安装程序证书
  • App Store 中的 Apple Transporter 应用程序
  1. 设置您的应用程序/版本,以便在 AppStore Connect上上传构建。

  2. 打包完成的应用发布:

    fyne release -appID com.example.myapp -appVersion 1.0 -appBuild 1 -category games
  3. .pkg拖到 Transporter 上,然后点击“交付”。

  4. 返回 AppStore Connect 网站,选择要发布的版本并提交审核。

谷歌商店(安卓)

先决条件:

  • Google Play 管理中心帐户
  • 分发密钥库( android 文档中的创建说明)
  1. 设置您的应用程序/版本,以便在 Google Play 控制台上上传。关闭“播放应用签名”选项,因为我们自己管理它。
  2. 打包完成的应用发布:
    fyne release -os android -appID com.example.myapp -appVersion 1.0 -appBuild 1
  3. 将.apk文件拖入 Play 管理中心应用版本页面的构建放置区
  4. 开始推出新版本。
1.9 应用元数据

命令的v2.1.0 版本开始,fyne我们支持元数据文件,该文件允许您将有关您的应用程序的信息存储在存储库中。此文件是可选的,但有助于避免必须记住每个包和发布命令的特定构建参数。
该文件应该FyneApp.toml在您运行fyne命令的目录中命名(这通常是main包)。该文件的内容如下:

Website = "https://example.com"

[Details]
  Icon = "app.png"
  Name = "测试元数据app"
  ID = "com.example.app"
  Version = "1.0.0"
  Build = 2
2.0 交叉编译

由于 Linux 系统能够轻松地交叉编译到 macOS 和 Windows,Fyne 开发人员推荐的工具是fyne-cross。它受到xgo的启发,并使用构建在golang-cross映像之上的docker映像,其中包括 Windows 的 MinGW 编译器和 macOS SDK,以及 Fyne 要求。
fyne-cross 允许为以下目标构建二进制文件并创建分发包:

GOOSGOARCH
darwinamd64
darwin386
linuxamd64
linux386
linuxarm64
linuxarm
windowsamd64
windows386
androidamd64
android386
androidarm64
androidarm
ios
freebsdamd64
freebsdarm64

要求

  • go >= 1.13
  • docker

安装

go get github.com/fyne-io/fyne-cross

用法

fyne-cross <command> [options]

The commands are:

    darwin        Build and package a fyne application for the darwin OS
    linux         Build and package a fyne application for the linux OS
    windows       Build and package a fyne application for the windows OS
    android       Build and package a fyne application for the android OS
    ios           Build and package a fyne application for the iOS OS
    freebsd       Build and package a fyne application for the freebsd OS
    version       Print the fyne-cross version information

Use "fyne-cross <command> -help" for more information about a command.

通配符

arch标志支持通配符,以防要针对指定 GOOS 的所有支持的 GOARCH 进行编译

fyne-cross windows -arch=*

等同于

fyne-cross windows -arch=amd64,386

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

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

相关文章

【一文看懂】Gumroad如何购物?Gumroad如何付款?Gumroad支付方式有哪些?Gumroad国内如何支付?

1.Gumroad付款方式 详情移步至底部原文查看~ 3.2.Gumroad数字商品的标价 详情移步至底部原文查看~ 点击【Pay】后&#xff0c;等待一会即可付款成功&#xff0c;点击【Download】即可下载购买的数字商品。 4.注意事项 详情移步至底部原文查看~ Gumroad如何购物&#xff1f;G…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Mysql集群

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建Mysql集群 MySQL 集群是一种高可用性、高性能的数据库解决方案&#xff0c;旨在支持分布式应用程序&#xff0c;允许多个 MySQL 实例以集群的方式共同工作&#xff0c;提供数据冗余和故障恢复能力 搭建Mysql集群…

计算机毕业设计之:基于微信小程序的中药材科普系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

优青博导团队指导-实验设计、实验结果分析、测序分析及SCI论文辅助

组蛋白甲基化修饰工具(H3K4me3 ChIP-seq) 组蛋白甲基化类型也有很多种&#xff0c;包括赖氨酸甲基化位点H3K4、H3K9、H3K27、H3K36、H3K79和H4K20等。组蛋白H3第4位赖氨酸的甲基化修饰(H3K4)在进化上高度保守&#xff0c;是被研究最多的组蛋白修饰之一。 DNA亲和纯化测序 DNA亲…

【小bug】使用 RestTemplate 工具从 JSON 数据反序列化为 Java 对象时报类型转换异常

起因&#xff1a;今天编写一个请求时需要通过RestTemplate调用外部接口&#xff0c;获取一些信息&#xff0c;但是在获取了外部接口响应内容后&#xff0c;使用强制转换发现报了类型转换异常。之前也遇到过&#xff0c;但是没记录下来&#xff0c;今天又查了一遍……干脆记录一…

Algo-Lab 2 Stack Queue ADT

Lab 2: Stack & Queue ADT Part 1 ​ 这里只说一下最小栈的思路&#xff0c;我们可以在定义一个栈&#xff0c;来同步存储当前情况下的占的最小值。最小栈第一时间的想法可能是设定一个变量&#xff0c;每次push进来栈中的元素进行对比&#xff0c;保持最小值&#xff0c;…

Redis渐进式遍历

我们知道&#xff0c;keys* 是一次性把所有的key都获取到&#xff0c;这个操作太危险&#xff0c;可能会一次性得到太多的key而阻塞服务器。但是通过渐进式遍历&#xff0c;既能够获取到所有的key&#xff0c;又能不会卡死服务器。 redis使用scan命令进行渐进式遍历&#xff0…

宠物去浮毛救星?希喂、小米、霍尼韦尔宠物空气净化器哪款好用

怎么有人放假也不开心&#xff1f; 快到的国庆假期真是愁死我了...本来我妈国庆去旅游&#xff0c;我就打算不回家&#xff0c;和我家猫过二人世界。结果突然有事&#xff0c;我妈取消出行&#xff0c;改成让我假期回家陪她。我回家容易&#xff0c;我家猫回去可难啊&#xff…

前端-js例子:todolist

实现效果图&#xff1a; 实现步骤&#xff1a; 1.body部分 1.首先&#xff0c;设置输入数据的框和按钮进行操作 2.设置一个表格标签&#xff08;有边框&#xff09;&#xff0c;首先在表头放置两列&#xff08;“事项”‘’操作&#xff09; <body><div class"…

初学者怎么入门大语言模型(LLM)?看完这篇你就懂了!

当前2024年&#xff0c;LLM领域发展日新月异&#xff0c;很多新的实用技术层出不穷&#xff0c;个人认为要跟上LLM的发展&#xff0c;需要掌握以下内容&#xff0c;并需要不断地跟踪学习。 入门LLM前置基础 深度学习基础知识&#xff1a;推荐李宏毅的深度学习课程Python和num…

数据结构2——单链表

目录 1.链表 1.1链表的概念及结构 1.2 链表的分类 ​编辑2.无头单链表的实现 1. 节点 2.遍历链表 3.动态增加新节点 4.查找&#xff08;修改&#xff09; 5.插入 5.1 尾插 5.2 头插 5.3 在pos之前插入x 5.4 在pos之后插入x 6.删除 6.1 尾删 6.2 头删 6.3 删除…

DPDK 简易应用开发之路 4:基于Pipeline模型的DNS服务器

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 使用scapy和wireshark发包抓包分析结果 完整代码见&#xff1a;github Pipeline模型 DPDK Pipeline模型是基于Data Plane Development Kit&#xff08;DPDK&#xff09;的高性能数据包处理框架。它通过将数据流分为多…

基于SpringBoot+Vue+MySQL的旅游推荐管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会的快速发展和人民生活水平的显著提高&#xff0c;旅游已成为人们休闲娱乐的重要方式。然而&#xff0c;面对海量的旅游信息和多样化的旅游需求&#xff0c;如何高效地管理和推荐旅游资源成为了一个亟待解决的问题。因此…

学习记录:js算法(四十三):翻转二叉树

文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点 图一&#xff1a; 图二&#xff1a; 示例 1&#xff1a;&#xff08;如图一&#xff09; 输入&#xff1a;root [4,2,7,1…

大模型价格战,打到了负毛利,卷or不卷?

国产大模型淘汰赛在加速。这轮淘汰赛会持续一两年&#xff0c;只有少数真正具备实力的基础模型企业能继续活下去 中国市场的大模型价格战已经打了近半年。这轮价格战已经打到了负毛利&#xff0c;而且暂时没有停止迹象。头部云厂商仍在酝酿新一轮降价。这轮降价会在今年9月下旬…

视频单目标跟踪研究

由于对视频单目标跟踪并不是很熟悉&#xff0c;所以首先得对该领域有个大致的了解。 视频目标跟踪是计算机视觉领域重要的基础性研究问题之一&#xff0c;是指在视频序列第一帧指定目标 后&#xff0c;在后续帧持续跟踪目标&#xff0c;即利用边界框&#xff08;通常用矩形框表…

printf 命令:格式化输出

一、命令简介 ​printf​ 命令在 Linux 系统中用于格式化并打印字符串到标准输出。它是 C 语言中 printf ​函数的命令行版本&#xff0c;因此其格式化选项与 C 语言中的非常相似。 相关命令&#xff1a; echo&#xff1a;通常使用 echo&#xff0c;它比较简单。printf&…

你们用过微信CRM管理系统吗?

微信CRM管理系统是近年来流行的管理软件&#xff0c;在市场上得到了很高的认可。许多企业正在应用微信CRM管理系统&#xff0c;那系统具体有些什么功能呢&#xff1f; 1、聚合聊天&#xff0c;可以管理多个微信号 2、批量多号自动加好友任务&#xff0c;设置好时间间隔以及加人…

《论软件系统架构风格》写作框架,软考高级系统架构设计师

论文真题 系统架构风格&#xff08;System Architecture Style&#xff09;是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一个词汇表和一组约束&#xff0c;词汇表中包含一些构件和连接件类型&#xff0c;而这组约束指出系统是如何将这些构件和连接件组合起…

李沐对大模型趋势的几点判断,小模型爆发了!

李沐是上海交通大学 2011 届计算机科学与工程系本硕系友。他曾担任亚马逊资深首席科学家&#xff0c;加州大学伯克利分校和斯坦福大学的访问助理教授&#xff0c;是前 Marianas Labs 联合创始人&#xff0c;深度学习框架 Apache MXNet 的创始人之一。目前是 BosonAI 联合创始人…