fyne的编写步骤和打包
fyne是一个使用Go编写的开源的跨平台UI工具包,依靠 Go 语言的优秀性能,尤其是 goroutine 协程的异步特性,实现了高性能、易开发的图形界面应用
fyne 并未基于现有的 UI 库进行开发,而是直接使用不同平台的图形驱动实现,完成了对跨平台 UI 的抽象
fyne的运行需要系统图形驱动程序以及C编译器,请确保在运行Fyne程序之前这两项工作已经完成
fyne包的安装:go get fyne.io/fyne/v2@latest
fyne包的结构
fyne将功能划分到多个子包中,常用的包
fyne.io/fyne/v2 提供所有fyne应用程序代码共用的基础定义,包括数据类型和接口 fyne.io/fyne/v2/app 应用程序 fyne.io/fyne/v2/canvas 绘制对象 fyne.io/fyne/v2/dialog 对话框 fyne.io/fyne/v2/container 用于组织和布局的容器 fyne.io/fyne/v2/layout 组件排列规则 fyne.io/fyne/v2/data/binding 数据绑定 fyne.io/fyne/v2/widget 多种组件,fyne所有的窗体控件和交互元素都在这个子包中
fyne程序的编写步骤
一、创建程序对象
通过"fyne.io/fyne/v2/app"包的app.New()方法创建
import "fyne.io/fyne/v2/app" myApp := app.New() Run()方法运行事件循环 Quit()方法退出程序
NewWithID(id string) :创建一个程序对象并设置其id,如果使用此方法创建应用,会覆盖编译时传入的id
使用New()方法创建的程序对象在大多数方法中均使用默认值"com.example.app"为其id,极个别方法在不明确设置其id时无法使用
如:当编译时使用了--release选项时不明确设置id时会报错
二、创建窗口对象
通过程序对象的NewWindow(Title)方法创建,Title参数为窗口标题
myWin := myApp.NewWindow("Hello")
三、创建组件
通过"fyne.io/fyne/v2/widget"包的NewXXX()方法创建常规组件
其中XXX为组件名,如NewLabel()、NewButton()、NewTable()等
通过"fyne.io/fyne/v2/canvas"包的NewXXX()方法创建画布组件
其中XXX为画布名,如NewText()、NewLine()等
import "fyne.io/fyne/v2/widget" lab := widget.NewLabel("Name") import "fyne.io/fyne/v2/canvas" import "image/color" text := canvas.NewText("Text Canvas", color.White)
四、创建容器
容器用于组织将要放入窗口对象中的组件
每个容器有不同的内部组件布局方式,如水平、垂直、居中、网格等
容器类似于一个盒子,每个盒子里面的组件布局方式
"fyne.io/fyne/v2/layout"包中的定义了多种组件布局方式
"fyne.io/fyne/v2/container"包的New()方法用于创建指定布局方式的容器
cont := container.New(layout.NewHBoxLayout(),lab,text) # 创建一个组件垂直布局的容器 # 该容器中有两个组件,lab和text
为了更加简化操作,fyne为我们整合了创建容器及指定布局方式
使用container.NewXXX()类型的函数直接创建指定局部方式的容器,如
container.NewVBox( zujians... ) 等价于 container.New( layout.NewVBoxLayout() , zujians... ) container.NewBorder( zujians... ) 等价于 container.New( layout.NewBorderLayout() , zujians... ) 等等
容器可以单独使用,也可以嵌套使用,以创建复杂的布局
五、组件或容器放置
通过窗口对象的SetContent()方法将组件或容器放置于窗口中
myWin.SetContent(lab) myWin.SetContent(text) myWin.SetContent(cont)
六、窗口显示
通过窗口对象的Show()方法显示窗口
myWin.Show()
七、开启事件循环
通过程序对象的Run()方法开启事件循环
myApp.Run()
fyne提供了一个整合窗口显示和开启事件循环的简化操作:窗口对象的ShowAndRun()方法
myWin.ShowAndRun()
实质上myWin.ShowAndRun()就是对上面两个步骤作了简单的封装,两者是完全等价的
程序打包
在最终程序打包时,我们可以使用go build命令,也可以使用fyne提供的一个专门的命令行工具来更方便地打包
fyne命令安装:go install fyne.io/fyne/v2/cmd/fyne@latest
安装完成后会在go的环境变量GOPATH目录下的bin目录中生成一个fyne.exe程序,将改目录添加至环境变量即可使用fyne命令进行打包
使用fyne命令的好处
1、可以打包应用程序的图标、字体、应用元数据等 2、根据目标平台的要求,生成符合平台规范的应用包 3、可以打包成安装程序
命令格式:fyne command [options] [args]
可用的command
bundle 将静态内容嵌入到go应用程序中 env 打印Fyne模块和环境信息 get 下载并安装Fyne应用程序 install 打包并安装应用程序 package 打包要分发的应用程序 release 准备应用程序以进行公开分发 version 显示fyne的版本信息。 serve 使用WebAssembly打包 build 生成应用程序 help,h 显示命令列表或一个命令的帮助
每个命令的使用方式可以使用fyne help command来查看
常用的就是打包命令:fyne package options
常用的选项options有
--os val 或 --target val 指定打包程序的目标操作系统和架构 格式为"osName/arch",其中架构可以省略 默认为当前系统及架构 常用系统名:windows、darwin、linux、android、ios、freebsd 常用架构明:386、amd64、arm、arm64 在进行跨平台打包时,要确保一些必要的工具或依赖已经安装 如Android打包需要安装Android SDK --tags vals 指定一些构建选项,多个选项使用逗号隔开,可选值 debug 显示调试信息,包括可视化布局 gles 强制使用嵌入式OpenGL而不是完整的OpenGL hints 显示改进或优化提示 mobile 模拟移动窗口中运行程序 no_animations 禁用标准小部件和容器中的非必要动画 no_emoji 不嵌入表情符号字体。将导致程序中无法使用表情符号但会使二进制文件更小 no_native_menus 专用于macOS,表示程序不使用macOS本机菜单,而是将菜单显示在应用程序窗口内 对于在macOS上测试应用程序以模拟Windows或Linux上的行为非常有用 --exe val 或 --executable val 指定打包的文件名 默认文件名为当前模块名,就是使用go mod init name命令时的name 默认目录为go文件所在目录下 实测该选项不起作用,即使指定仍然是以--name指定为准,如果没有--name,那么使用当前模块名 --name val :指定应用程序在系统中的名称,即不含后缀名的打包程序名 通常用于显示在用户的桌面或应用菜单中 默认为为当前模块名 在windows中,使用命令行指定name中含中文会乱码,使用FyneApp.toml文件指定name正常显示 --appVersion val :指定程序的版本号,格式为X[.Y[.Z]] --appBuild val :设定程序的构建编号 在一个程序版本中可能会根据不同的平台不同的配置进行多次编译 每次编译添加不同的构建编号用于区分同一个版本号的不同编译 值为任意值,如"20240403" --src val 或 --sourceDir val 指定要打包的程序所在目录 默认为当前所在目录 --icon val :指定一个png格式的图片作为程序的图标 在打包时会按照目标平台的图标设计标准自动调整并重新生成图标 可能包括调整大小、添加圆角或其他优化 --use-raw-icon :不进行图标优化 --id val 或 --appID val :指定应用的唯一标识符 一般格式是反向域名形式 --cert val 或 --certificate val 指定在打包过程中用于签名应用的证书文件的路径 macOS通常需要一个 .p12 格式的证书文件 Windows可能需要一个 .pfx 或 .p12 格式的证书文件 --release :以发布模式打包 fyne会采取额外的步骤来优化最终应用的性能和体积以及去除调试功能 编译时间会大幅度加长 --metadata val 在编译时忽略在FyneApp.toml文件中的元数据键值对 val格式为"key=val"格式 自v2.1.0版本以来,fyne支持一个元数据文件FyneApp.toml 每次编译时不指定的元数据选项会使用该配置文件中的值 从而避免每次编译命令都输入过多的选项
FyneApp.toml文件
Website = "https://example.com" [Details] Icon = "Icon.png" Name = "My App" ID = "com.example.app" Version = "1.0.0" Build = 1
其中Build会附加到Version之后并且在每次编译后自动增加1
如上例中程序版本会显示为1.2.3.1