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

本文档注意参考官网(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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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 OSlinux         Build and package a fyne application for the linux OSwindows       Build and package a fyne application for the windows OSandroid       Build and package a fyne application for the android OSios           Build and package a fyne application for the iOS OSfreebsd       Build and package a fyne application for the freebsd OSversion       Print the fyne-cross version informationUse "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.rhkb.cn/news/430501.html

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

相关文章

镭射限高防外破预警装置-线路防外破可视化监控,安全尽在掌握中

镭射限高防外破预警装置-线路防外破可视化监控&#xff0c;安全尽在掌握中 在城市化浪潮的汹涌推进中&#xff0c;电力如同现代社会的生命之脉&#xff0c;其安全稳定运行直接关系到每一个人的生活质量和社会的整体发展。然而&#xff0c;随着建设的加速&#xff0c;电力设施通…

部署wordpress项目

一、先部署mariadb 二、在远程登录工具上进行登录测试&#xff0c;端口号为30117&#xff0c;用户为 root&#xff0c;密码为123 三、使用测试工具&#xff1a; [rootk8s-master aaa]# kubectl exec -it pods/cluster-test0-58689d5d5d-7c49r -- bash 四、部署wordpress [root…

论文阅读 | 基于流模型和可逆噪声层的鲁棒水印框架(AAAI 2023)

Flow-based Robust Watermarking with Invertible Noise Layer for Black-box DistortionsAAAI, 2023&#xff0c;新加坡国立大学&中国科学技术大学本论文提出一种基于流的鲁棒数字水印框架&#xff0c;该框架采用了可逆噪声层来抵御黑盒失真。 一、问题 基于深度神经网络…

【AI算法岗面试八股面经【超全整理】——NLP】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

教师管理系统小程序+ssm论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&…

Unity 热更新(HybridCLR+Addressable)-创建Addressable资源

三、创建Addressable资源 创建三个文件夹&#xff0c;放Addressable资源&#xff0c;里面对应放程序集&#xff0c;预制体以及场景 拖拽到Addressable Groups对应组中 其中文件名太长&#xff0c;带着路径&#xff0c;可以简化名字 创建一个脚本&#xff0c;对于这个脚本进行一…

vue3自定义hooks

引言 Vue3引入了组合式API&#xff0c;使得代码逻辑更自由、灵活。其中自定义Hooks能让我们将客服用的逻辑抽离成一个独立的函数&#xff0c;以实现在多个组件中复用的目的。可以简单理解成封装成一个模块&#xff0c;以方便其他地方调用。 实现 自定义hooks useDog impor…

杰发科技——Eclipse环境安装

文件已传到网盘&#xff1a; 1. 安装文件准备 2. 安装Make 默认路径&#xff1a;C:\Program Files (x86)\GnuWin32\bin\ 不复制的话会报错 Error: Program "make" not found in PATH 3. 安装工具链 默认路径&#xff1a;C:\Program Files (x86)\Arm GNU Toolchain…

闯关leetcode——69. Sqrt(x)

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/sqrtx/description/ 内容 Given a non-negative integer x, return the square root of x rounded down to the nearest integer. The returned integer should be non-negative as well. You mu…

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

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

模拟实现(优先级队列)priority_queue:优先级队列、仿函数、 反向迭代器等的介绍

文章目录 前言一、优先级队列二、仿函数三、 反向迭代器总结 前言 模拟实现&#xff08;优先级队列&#xff09;priority_queue&#xff1a;优先级队列、仿函数、 反向迭代器等的介绍 一、优先级队列 优先级队列本质是一个堆&#xff0c;使用vector容器进一步改进进行实现&am…

vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源

之前项目使用的pdf.js 是2.15.349版本&#xff0c;最近换了一个4.6.82的版本&#xff0c;在本地上浏览文件运行的好好的&#xff0c;但是发布到服务器&#xff08;IIS&#xff09;上打不开文件&#xff0c;控制台提示找不到pdf.mjs viewer.mjs。 之前使用的2.15.349pdf和viewer…

mock虚拟接口技术

一、什么是mock mock指的就是使用mock创建出来的一个虚拟的接口 二、对于测试人员而言&#xff0c;我们为什么要使用mock 当我们进行接口测试时&#xff0c;如果对应的接口还没有开发好&#xff0c;但是我们又需要用到这个接口响应的信息&#xff0c;这个时候我们就可以使用…

邮件发送高级功能详解:HTML格式、附件添加与SSL/TLS加密连接

目录 一、邮件HTML格式设置 1.1 HTML邮件的优势 1.2 HTML邮件的编写 二、添加附件 2.1 附件的重要性 2.2 添加附件的代码示例 2.3 注意事项 三、使用SSL/TLS加密连接 3.1 SSL/TLS加密的重要性 3.2 SSL/TLS加密的工作原理 3.3 在邮件发送中启用SSL/TLS 3.3.1 邮件客…

智能算法躲避拥堵,高德企业用车上线“动态选路服务”为出行提效

近日&#xff0c;高德企业用车正式上线了一项全新服务——“动态选路服务”&#xff0c;旨在基于智能算法&#xff0c;动态规避突发拥堵路线&#xff0c;为企业用车用户提供更便捷、智能的出行方案。 以技术着眼细节&#xff0c;高德企业用车在帮助企业用车用户节约出行时间和…

飞睿智能实时雷达活体探测传感器模块,智能家居静止检测实时感知人员有无

随着科技的飞速发展&#xff0c;我们的生活正在经历着未有的创新。在这个创新的浪潮中&#xff0c;实时雷达活体探测传感器模块的技术正逐渐崭露头角&#xff0c;以其独特的优势为我们的生活带来安全与便捷。今天&#xff0c;我们就来详细探讨一下这项技术&#xff0c;看看它是…

TCL25届校招测评笔试TAS人才测评题库:高分攻略真题分析

&#x1f31f; 职场新人必看&#xff1a;TCL校招测评全解析 &#x1f31f; 亲爱的小伙伴们&#xff0c;你是否正准备踏入职场&#xff0c;或是对即将到来的校招感到既兴奋又紧张&#xff1f;今天&#xff0c;我将带你深入了解TCL校招中的TAS人才测评&#xff0c;让你在面试前做…

MyBatis - 动态SQL

前言 我们在某网站填写个人信息时&#xff0c;时常会遇到可以选填的空&#xff08;即可填&#xff0c;可不填&#xff09;&#xff0c;由于之前讲过的Java中的SQL语句都是固定的&#xff0c;且我们不可能对所有情况都写出与之对应的插入语句&#xff08;太过繁琐&#xff09;&…

最新简洁大方的自动发卡网站源码/鲸发卡v11.61系统源码/修复版

源码简介&#xff1a; 最新简洁大方的自动发卡网站源码&#xff0c;它就是鲸发卡v11.61系统源码&#xff0c;它是修复版。 说到鲸发卡系统&#xff0c;鲸发卡系统在发卡圈很多人都知道的&#xff0c;它是市面最好发卡系统之一&#xff0c;操作起来简单得很&#xff0c;界面也…

03-Docker下载加速

03-Docker下载加速 docker下载加速 方式1&#xff1a;使用 网易数帆、阿里云等容器镜像仓库进行下载。 网易数帆官网&#xff1a;https://sf.163.com/ 例如&#xff0c;下载网易数帆镜像中的mysql。&#xff08;网易数帆的地址为 hub.c.163.com&#xff0c;网易数帆对dockerh…