go桌面框架Fyne最全api文档
Fyne
是一个 Go 语言的跨平台 GUI 库
相关命令
//全局安装fyne打包工具
go install fyne.io/fyne/v2/cmd/fyne@latest
// 引入fyne库
go get fyne.io/fyne/v2@latest
go mod tidy
//以窗口形式启动
go run main.go
//以手机模拟器形式启动
go run -tags mobile main.go
//打包
//桌面端
fyne package -os windows -icon icon.png
//移动端
fyne package -os android -appID my.domain.appname
fyne install -os android
fyne package -os ios -appID my.domain.appname
fyne package -os iossimulator -appID my.domain.appname
基本示例
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Hello")
hello := widget.NewLabel("Hello Fyne!")
w.SetContent(container.NewVBox(
hello,
widget.NewButton("Hi!", func() {
hello.SetText("Welcome :)")
}),
))
w.ShowAndRun()
}
1. app
包
app.New()
:创建一个新的Fyne
应用实例。app.NewWithID(id string)
:创建带有唯一标识的应用实例,用于在不同会话间共享数据。app.NewWindow(title string)
:为应用创建一个新窗口。
2. canvas
包
canvas.NewText(text string, color color.Color)
:创建文本元素,可自定义颜色。canvas.NewRectangle(color color.Color)
:创建一个矩形图形,可用于绘制背景或形状。canvas.NewCircle(color color.Color)
:创建一个圆形图形。canvas.NewImageFromFile(filename string)
:加载并显示文件中的图像。canvas.NewLine(color color.Color)
:创建一条直线,用于简单的图形绘制。
3. container
包
container.NewVBox(objects ...fyne.CanvasObject)
:创建一个垂直布局容器,按顺序从上到下排列内容。container.NewHBox(objects ...fyne.CanvasObject)
:创建一个水平布局容器,按顺序从左到右排列内容。container.NewGridWithRows(rows int, objects ...fyne.CanvasObject)
:按指定行数创建网格布局容器。container.NewTabContainer(tabs ...*container.TabItem)
:创建带选项卡的容器。container.NewBorderContainer(top, bottom, left, right fyne.CanvasObject, content fyne.CanvasObject)
:创建边框布局容器,四边可固定元素,中间为内容区域。
4. dialog
包
dialog.NewConfirm(title string, message string, onConfirm func(bool), parent fyne.Window)
:确认对话框,带确认和取消按钮。dialog.NewInformation(title string, message string, parent fyne.Window)
:信息对话框,用于显示信息性消息。dialog.ShowFileOpen(callback func(fyne.URIReadCloser, error), parent fyne.Window)
:打开文件选择器对话框。dialog.ShowFileSave(callback func(fyne.URIWriteCloser, error), parent fyne.Window)
:打开文件保存对话框。dialog.ShowCustom(title string, dismiss string, content fyne.CanvasObject, parent fyne.Window)
:自定义对话框,允许自定义内容。
5. widget
包
widget.NewLabel(text string)
:创建文本标签。widget.NewButton(label string, tapped func())
:创建按钮,点击时触发指定事件。widget.NewEntry()
:创建文本输入框,用户可输入单行文本。widget.NewPasswordEntry()
:创建密码输入框,输入的文本被掩盖。widget.NewForm(items ...*widget.FormItem)
:创建表单,支持不同类型的输入控件。widget.NewSelect(options []string, changed func(string))
:下拉选择框,提供多个选择项。widget.NewCheck(label string, changed func(bool))
:复选框,可选中或取消选中。widget.NewRadio(options []string, selected func(string))
:单选框组,提供多个单选项。widget.NewSlider(min, max float64)
:滑动条,可选择范围值。widget.NewProgressBar()
:进度条,用于表示任务的进度。
6. theme
包
theme.DefaultTheme()
:获取默认主题。theme.NewLightTheme()
:获取亮色主题。theme.NewDarkTheme()
:获取暗色主题。theme.Icon(name fyne.ThemeIconName)
:获取系统内置图标。theme.Font(size int)
:获取字体样式和大小。
7. layout
包
layout.NewSpacer()
:创建一个空白填充区域,用于调整组件间的间距。layout.NewVBoxLayout()
:垂直布局,将内容从上到下排列。layout.NewHBoxLayout()
:水平布局,将内容从左到右排列。layout.NewGridLayout(rows int)
:网格布局,按指定行数排列内容。layout.NewBorderLayout(top, bottom, left, right fyne.CanvasObject)
:边框布局,四边固定内容。
8. fyne
包(核心接口)
fyne.App
:应用程序接口,用于启动和管理窗口。fyne.Window
:窗口接口,表示应用程序中的窗口。fyne.CanvasObject
:所有UI组件的基本接口。fyne.Container
:容器接口,用于包含和布局多个组件。fyne.Theme
:主题接口,用于自定义应用程序外观。fyne.URIReadCloser
和fyne.URIWriteCloser
:文件读写接口,用于读取和保存文件。
实战示例
1. 应用程序基础设置(app
包)
- 创建应用实例、窗口,并设置内容。
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New() // 创建应用实例
myWindow := myApp.NewWindow("Hello") // 创建窗口实例
label := widget.NewLabel("Hello, Fyne") // 创建标签
myWindow.SetContent(container.NewVBox(
label,
widget.NewButton("点击我", func() {
label.SetText("按钮被点击了!")
}),
)) // 将标签和按钮加入窗口内容
myWindow.ShowAndRun() // 显示窗口并运行应用
}
2. 文本输入框与按钮(widget
包)
- 创建带输入框和按钮的简单表单,点击按钮显示输入内容。
package main
import (
"fmt"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("输入框示例")
entry := widget.NewEntry()
entry.SetPlaceHolder("请输入内容")
button := widget.NewButton("提交", func() {
fmt.Println("输入内容:", entry.Text)
})
myWindow.SetContent(container.NewVBox(
entry,
button,
))
myWindow.ShowAndRun()
}
3. 文件选择对话框(dialog
包)
- 打开文件选择器,选择文件后显示文件路径。
package main
import (
"fmt"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("文件选择器示例")
label := widget.NewLabel("文件路径会在这里显示")
button := widget.NewButton("选择文件", func() {
dialog.ShowFileOpen(func(reader fyne.URIReadCloser, err error) {
if err == nil && reader != nil {
label.SetText("文件路径: " + reader.URI().Path())
fmt.Println("选择的文件路径:", reader.URI().Path())
}
}, myWindow)
})
myWindow.SetContent(container.NewVBox(
button,
label,
))
myWindow.ShowAndRun()
}
4. 布局示例(container
包)
- 使用
HBox
和VBox
布局容器。
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("布局示例")
hBox := container.NewHBox(
widget.NewButton("左", nil),
widget.NewButton("中", nil),
widget.NewButton("右", nil),
)
vBox := container.NewVBox(
widget.NewLabel("上"),
hBox,
widget.NewLabel("下"),
)
myWindow.SetContent(vBox)
myWindow.ShowAndRun()
}
5. 进度条(widget
包)
- 创建一个进度条,并模拟进度变化。
package main
import (
"time"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("进度条示例")
progress := widget.NewProgressBar()
progress.SetValue(0.0)
myWindow.SetContent(container.NewVBox(
progress,
))
go func() {
for i := 0.0; i <= 1.0; i += 0.1 {
time.Sleep(time.Second)
progress.SetValue(i)
}
}()
myWindow.ShowAndRun()
}
6. 选项卡布局(container
包)
- 创建带有多个选项卡的窗口。
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("选项卡示例")
tab1 := container.NewTabItem("Tab 1", widget.NewLabel("这是第一个选项卡"))
tab2 := container.NewTabItem("Tab 2", widget.NewLabel("这是第二个选项卡"))
tabContainer := container.NewAppTabs(tab1, tab2)
myWindow.SetContent(tabContainer)
myWindow.ShowAndRun()
}
7. 自定义对话框(dialog
包)
- 创建带自定义内容的对话框。
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("自定义对话框示例")
button := widget.NewButton("打开对话框", func() {
content := widget.NewLabel("这是一个自定义对话框")
dialog.ShowCustom("标题", "关闭", content, myWindow)
})
myWindow.SetContent(container.NewVBox(
button,
))
myWindow.ShowAndRun()
}
应用打包
使用 Fyne
打包 Go 应用程序可以通过 fyne
的命令行工具完成。该工具支持将应用程序打包成可执行文件,并生成不同平台的包格式(如 .app
、.exe
等)。
步骤 1:安装 fyne
命令行工具
安装 fyne
命令行工具。如果未安装,可以通过以下命令安装:
go install fyne.io/fyne/v2/cmd/fyne@latest
步骤 2:配置应用程序的图标和元数据
在打包之前,最好为应用程序设置图标和元数据,fyne
使用 fyne package
命令自动加载这些信息。可以通过设置 fyne
提供的以下标签完成配置。
创建一个 fyne.yml
文件(或直接在 go
文件中使用注释)并填写以下内容:
配置文件:fyne.yml
name: MyApp # 应用名称
icon: "icon.png" # 应用图标,放在项目根目录
version: "1.0.0" # 版本号
步骤 3:构建并打包应用程序
fyne
工具支持跨平台构建,以下是常见平台的打包方法。
1. 本地平台打包
在项目目录中运行以下命令,将应用程序打包成当前系统的可执行文件:
fyne package
执行后,会在当前目录生成一个对应平台的可执行文件:
- Windows:生成
.exe
文件。 - macOS:生成
.app
文件。 - Linux:生成标准的可执行文件。
2. 指定平台打包
fyne
支持交叉编译和打包。可以使用环境变量来指定目标平台:
打包 Windows 应用程序
GOOS=windows GOARCH=amd64 fyne package -os windows
打包 macOS 应用程序
GOOS=darwin GOARCH=amd64 fyne package -os darwin
打包 Linux 应用程序
GOOS=linux GOARCH=amd64 fyne package -os linux
3. 指定输出文件名
可以使用 -output
标志指定生成文件的名称,例如:
fyne package -output MyApp
步骤 4:生成安装包(可选)
fyne
还支持生成平台专用的安装包,例如 macOS 的 .dmg
文件或 Windows 的 .msi
文件。可以通过以下方式生成这些安装包:
Windows 的 .msi
安装包
fyne package -os windows -icon icon.png -appID "com.mycompany.myapp" -install
macOS 的 .dmg
安装包
fyne package -os darwin -icon icon.png -appID "com.mycompany.myapp" -install
Linux 的 .deb
安装包
fyne package -os linux -icon icon.png -appID "com.mycompany.myapp" -install
示例:打包一个 Windows 可执行文件
假设您有一个 Windows 环境,运行以下命令来生成带图标的 .exe
文件:
fyne package -os windows -icon icon.png
步骤 5:测试和发布
生成的应用程序可以直接运行以测试功能。确保在每个平台上测试以验证应用的兼容性,之后即可将打包的文件上传至发布平台(如 GitHub、应用商店或公司内部系统)。
通过 fyne
的打包工具,可以方便地将 Fyne
应用分发到不同平台,支持跨平台开发的需求。