golang跨平台原生GUI开发插件库ui的使用
Golang跨平台原生GUI开发插件库ui的使用
简介
ui是一个旨在为Go语言提供简单GUI软件开发的库。它基于libui(一个用C编写的简单跨平台库),可以在以下平台运行:
- Windows: 需要cgo,Windows Vista SP2 with Platform Update及更新版本
- Mac OS X: 需要cgo,Mac OS X 10.8及更新版本
- 其他Unix系统: 需要cgo,GTK+ 3.10及更新版本
- Debian/Ubuntu等:
sudo apt-get install libgtk-3-dev
- Red Hat/Fedora等:
sudo dnf install gtk3-devel
- Debian/Ubuntu等:
同时需要Go 1.8或更新版本。
当前状态
ui库目前处于中期alpha阶段。现有功能足够运行示例和一些小程序,但稳定性仍在改进中,部分功能还不完整,某些平台可能存在bug。
安装
安装依赖后,只需执行:
go get github.com/andlabs/ui/...
文档
代码内文档足够开始使用,但需要改进。examples
目录中有一些简单的示例程序,可以单独go build
每个示例。
Windows清单文件
在Windows上,ui库需要一个指定Common Controls v6的清单文件。最简单的方法是导入winmanifest
子包:
import _ "github.com/andlabs/ui/winmanifest"
在非Windows平台上,这个导入不会有任何影响。
macOS程序执行
如果直接从命令行运行macOS程序二进制文件,它将在后台启动。这是有意设计的。
完整示例
下面是一个简单的跨平台GUI应用程序示例:
package main
import (
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest" // 用于Windows清单
)
func main() {
// 初始化UI
err := ui.Main(func() {
// 创建窗口
window := ui.NewWindow("Hello", 300, 200, false)
// 创建按钮
button := ui.NewButton("点击我")
// 创建标签
label := ui.NewLabel("")
// 创建垂直布局容器
box := ui.NewVerticalBox()
box.Append(button, false)
box.Append(label, false)
// 设置窗口内容
window.SetChild(box)
// 按钮点击事件
button.OnClicked(func(*ui.Button) {
label.SetText("你好,世界!")
})
// 窗口关闭事件
window.OnClosing(func(*ui.Window) bool {
ui.Quit()
return true
})
// 显示窗口
window.Show()
})
if err != nil {
panic(err)
}
}
更复杂的示例
下面是一个包含多个控件的示例:
package main
import (
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
)
func main() {
err := ui.Main(func() {
// 主窗口
window := ui.NewWindow("UI 示例", 640, 480, true)
window.SetMargined(true)
// 主布局
mainBox := ui.NewVerticalBox()
mainBox.SetPadded(true)
// 表单组
group := ui.NewGroup("表单")
group.SetMargined(true)
mainBox.Append(group, false)
form := ui.NewForm()
form.SetPadded(true)
group.SetChild(form)
// 表单控件
entry := ui.NewEntry()
form.Append("输入框", entry, false)
password := ui.NewPasswordEntry()
form.Append("密码", password, false)
checkbox := ui.NewCheckbox("复选框")
form.Append("", checkbox, false)
// 按钮区域
buttons := ui.NewHorizontalBox()
buttons.SetPadded(true)
mainBox.Append(buttons, false)
button := ui.NewButton("确定")
buttons.Append(button, true)
cancel := ui.NewButton("取消")
buttons.Append(cancel, true)
// 事件处理
button.OnClicked(func(*ui.Button) {
ui.MsgBox(window, "信息",
"输入内容: "+entry.Text()+"\n"+
"密码: "+password.Text()+"\n"+
"复选框: "+checkbox.Text())
})
cancel.OnClicked(func(*ui.Button) {
ui.Quit()
})
window.OnClosing(func(*ui.Window) bool {
ui.Quit()
return true
})
window.SetChild(mainBox)
window.Show()
})
if err != nil {
panic(err)
}
}
这个库提供了创建原生GUI应用程序所需的基本组件,包括窗口、按钮、标签、输入框等。通过组合这些组件,可以构建出跨平台的GUI应用程序。
更多关于golang跨平台原生GUI开发插件库ui的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang跨平台原生GUI开发插件库ui的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang跨平台原生GUI开发:ui库使用指南
ui
是一个Go语言的跨平台原生GUI库,它提供了创建本地界面元素的能力,支持Windows、macOS和Linux系统。下面我将详细介绍如何使用这个库进行GUI开发。
安装ui库
首先需要安装ui库:
go get github.com/andlabs/ui
基本使用示例
下面是一个简单的窗口应用示例:
package main
import (
"github.com/andlabs/ui"
)
func main() {
err := ui.Main(func() {
// 创建窗口
window := ui.NewWindow("Hello", 300, 200, false)
// 创建按钮
button := ui.NewButton("点击我")
button.OnClicked(func(*ui.Button) {
ui.MsgBox(window, "提示", "你好,世界!")
})
// 创建垂直布局容器
box := ui.NewVerticalBox()
box.Append(ui.NewLabel("欢迎使用ui库"), false)
box.Append(button, false)
// 设置窗口内容
window.SetChild(box)
// 窗口关闭事件
window.OnClosing(func(*ui.Window) bool {
ui.Quit()
return true
})
// 显示窗口
window.Show()
})
if err != nil {
panic(err)
}
}
主要组件介绍
1. 基本控件
// 标签
label := ui.NewLabel("这是一个标签")
// 按钮
button := ui.NewButton("按钮")
button.OnClicked(func(*ui.Button) {
// 按钮点击事件处理
})
// 输入框
entry := ui.NewEntry()
text := entry.Text() // 获取文本
entry.SetText("新文本") // 设置文本
// 多行文本框
multilineEntry := ui.NewMultilineEntry()
2. 布局容器
// 垂直布局
vbox := ui.NewVerticalBox()
vbox.Append(control1, stretchy) // stretchy表示是否拉伸
// 水平布局
hbox := ui.NewHorizontalBox()
hbox.Append(control1, stretchy)
// 分组框
group := ui.NewGroup("分组标题")
group.SetChild(ui.NewLabel("分组内容"))
// 选项卡
tab := ui.NewTab()
tab.Append("标签1", ui.NewLabel("内容1"))
tab.Append("标签2", ui.NewLabel("内容2"))
3. 高级控件
// 进度条
progressBar := ui.NewProgressBar()
progressBar.SetValue(50) // 设置进度值(0-100)
// 滑块
slider := ui.NewSlider(0, 100)
slider.SetValue(50)
slider.OnChanged(func(*ui.Slider) {
value := slider.Value()
// 处理值变化
})
// 复选框
checkbox := ui.NewCheckbox("选项")
if checkbox.Checked() {
// 复选框被选中
}
// 单选框
radioButtons := ui.NewRadioButtons()
radioButtons.Append("选项1")
radioButtons.Append("选项2")
selected := radioButtons.Selected() // 获取选中项索引
完整示例:简单的计算器
package main
import (
"github.com/andlabs/ui"
)
func main() {
err := ui.Main(func() {
// 创建窗口
window := ui.NewWindow("简单计算器", 300, 200, false)
// 创建输入控件
num1 := ui.NewEntry()
num2 := ui.NewEntry()
result := ui.NewLabel("结果将显示在这里")
// 创建按钮
addBtn := ui.NewButton("相加")
addBtn.OnClicked(func(*ui.Button) {
n1, n2, ok := getNumbers(num1, num2)
if ok {
result.SetText(ui.Sprintf("%.2f", n1+n2))
}
})
// 布局
form := ui.NewForm()
form.Append("数字1", num1, false)
form.Append("数字2", num2, false)
form.Append("", addBtn, false)
form.Append("结果", result, false)
window.SetChild(form)
window.OnClosing(func(*ui.Window) bool {
ui.Quit()
return true
})
window.Show()
})
if err != nil {
panic(err)
}
}
func getNumbers(num1, num2 *ui.Entry) (float64, float64, bool) {
n1, err := strconv.ParseFloat(num1.Text(), 64)
if err != nil {
ui.MsgBoxError(nil, "错误", "第一个数字无效")
return 0, 0, false
}
n2, err := strconv.ParseFloat(num2.Text(), 64)
if err != nil {
ui.MsgBoxError(nil, "错误", "第二个数字无效")
return 0, 0, false
}
return n1, n2, true
}
注意事项
- 所有UI操作必须在
ui.Main()
函数中执行 - 控件的事件处理函数会在UI线程中调用
- 跨线程操作UI需要使用
ui.QueueMain()
函数 - 该库目前维护不活跃,对于复杂应用可能需要考虑其他GUI方案
替代方案
如果ui
库不能满足需求,可以考虑以下替代方案:
- Fyne (https://fyne.io/)
- Gio (https://gioui.org/)
- Wails (https://wails.io/) - 结合Web前端技术
希望这个指南能帮助你开始使用Go语言进行跨平台GUI开发!