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

同时需要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

1 回复

更多关于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
}

注意事项

  1. 所有UI操作必须在ui.Main()函数中执行
  2. 控件的事件处理函数会在UI线程中调用
  3. 跨线程操作UI需要使用ui.QueueMain()函数
  4. 该库目前维护不活跃,对于复杂应用可能需要考虑其他GUI方案

替代方案

如果ui库不能满足需求,可以考虑以下替代方案:

希望这个指南能帮助你开始使用Go语言进行跨平台GUI开发!

回到顶部