注册 登录

清河洛

fyne的编写步骤和打包

qingheluo2024-04-04清河洛2117
fyne是一个使用Go编写的开源的跨平台UI工具包,依靠 Go 语言的优秀性能,尤其是 goroutine 协程的异步特性,实现了高性能、易开发的图形界面应用开源网址:github.com/fyne-io/fynefyne 并未基于现有的 UI 库进行开发,而是直接使用不同平台的图形驱动实现,完成了对跨平台 UI 的抽象fyne的运行需要系统图形驱动程序以及C编译器,请确保在运行Fyne程序之前这两项工作已经完成fyne包的安装:go get fyne.io/fyne/v2@latestfyne包的结构fyne将功能划分到多个子包中,常用的包 fyne.io/fyne/v2 ...

fyne是一个使用Go编写的开源的跨平台UI工具包,依靠 Go 语言的优秀性能,尤其是 goroutine 协程的异步特性,实现了高性能、易开发的图形界面应用

开源网址github.com/fyne-io/fyne

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



网址导航