使用 giu 在 Go 中创建 UI
最后修改于 2024 年 4 月 30 日
在本文中,我们将展示如何使用跨平台的 giu 库在 Go 中创建 UI。
giu 是一个基于 Dear ImGui 的快速跨平台 GUI 框架,适用于 Go。Dear ImGui 是一个 C++ 的无膨胀图形用户界面库。
Dear ImGui 使用即时模式 GUI 范式来定义界面。与传统的工具包(如 Qt、Gtk 或 Swing)不同,在传统工具包中,我们创建单独的 UI 对象并管理它们的 state,而在即时模式中,我们直接告诉 GUI 库每一帧要绘制什么。
即时模式 GUI 常用于游戏开发。
giu 是 Dear ImGui C 接口的 Go 封装。它使用方便的构建器模式来构建小部件。
标签小部件
标签是一个显示文本的小部件。
package main
import (
g "github.com/AllenDang/giu"
)
func loop() {
g.SingleWindow().Layout(
g.Label("An old falcon in the sky"),
)
}
func main() {
wnd := g.NewMasterWindow("Application", 400, 200,
g.MasterWindowFlagsFloating)
wnd.Run(loop)
}
在示例中,我们创建了一个显示一些文本的窗口。
import (
g "github.com/AllenDang/giu"
)
我们导入库并给它起一个 `g` 的别名。
func loop() {
g.SingleWindow().Layout(
g.Label("An old falcon in the sky"),
)
}
每一帧都会调用 `loop` 函数。在该函数中,我们创建应用程序的 UI。在我们的例子中,我们在窗口中创建了一个单一窗口和一个标签。
func main() {
wnd := g.NewMasterWindow("Application", 400, 200,
g.MasterWindowFlagsFloating)
wnd.Run(loop)
}
在 `main` 函数中,我们创建了主窗口。`g.NewMasterWindow` 函数接受应用程序标题、窗口宽度和高度以及窗口标志作为参数。`Run` 函数运行主循环。在每一帧中,`loop` 函数用于构建 UI。`Run` 应在设置主窗口后,在 `main` 函数的末尾调用。
快捷键
键盘快捷键是在键盘上按下的组合键,用于执行操作。它们是通过 `RegisterKeyboardShortcuts` 创建的。
package main
import (
"os"
g "github.com/AllenDang/giu"
)
func loop() {
g.SingleWindow().Layout(
g.Label("Ctrl + Q to exit"),
)
}
func main() {
wnd := g.NewMasterWindow("Window", 400, 200, g.MasterWindowFlagsFloating).RegisterKeyboardShortcuts(
g.WindowShortcut{
Key: g.KeyQ,
Modifier: g.ModControl,
Callback: func() { os.Exit(0) }},
)
wnd.Run(loop)
}
在示例中,我们定义了 `Ctrl+Q` 快捷键。它会终止应用程序。
wnd := g.NewMasterWindow("Window", 400, 200, g.MasterWindowFlagsFloating).RegisterKeyboardShortcuts(
g.WindowShortcut{
Key: g.KeyQ,
Modifier: g.ModControl,
Callback: func() { os.Exit(0) }},
)
`RegisterKeyboardShortcuts` 在主窗口上调用。在 `g.WindowShortcut` 结构中,我们定义了按键、修饰键和回调。对于我们的快捷键,我们调用 `os.Exit` 函数来终止应用程序。
按钮小部件
按钮是一个基本的小部件,按下时会执行一个操作。
package main
import (
"fmt"
g "github.com/AllenDang/giu"
)
func loop() {
g.SingleWindow().Layout(
g.Button("Click").Size(80, 30).OnClick(func() {
fmt.Println("button clicked")
}),
)
}
func main() {
wnd := g.NewMasterWindow("Button", 400, 200, 0)
wnd.Run(loop)
}
在示例中,按钮按下后会在控制台中写入一条消息。
g.SingleWindow().Layout(
g.Button("Click").Size(80, 30).OnClick(func() {
fmt.Println("button clicked")
}),
)
按钮是通过 `g.Button` 创建的。`Size` 用于调整小部件大小。`OnClick` 函数定义了按钮单击事件的回调。
复选框小部件
复选框小部件是在用户界面中用于做出二元选择的图形元素。它是一个可以被选中或取消选中的小方框。
package main
import (
g "github.com/AllenDang/giu"
)
var cbSelected bool = true
func loop() {
g.SingleWindow().Layout(
g.Checkbox("Show Title", &cbSelected).OnChange(
func() {
if cbSelected {
g.Context.GetPlatform().SetTitle("CheckBox")
} else {
g.Context.GetPlatform().SetTitle("")
}
}),
)
}
func main() {
wnd := g.NewMasterWindow("Checkbox", 400, 200,
g.MasterWindowFlagsFloating)
wnd.Run(loop)
}
在示例中,复选框小部件在被选中时会显示一个窗口标题。
var cbSelected bool = true
这是存储小部件状态的布尔变量。
g.Checkbox("Show Title", &cbSelected).OnChange(
func() {
if cbSelected {
g.Context.GetPlatform().SetTitle("CheckBox")
} else {
g.Context.GetPlatform().SetTitle("")
}
}),
复选框是通过 `g.Checkbox` 函数创建的。它接受标签和关联的状态变量作为参数。当复选框被选中或取消选中时,会调用 `OnChange` 函数。我们通过 `g.Context.GetPlatform().SetTitle()` 函数来更改窗口标题。
画布小部件
画布小部件用于绘制我们自定义的形状。
package main
import (
"image"
"image/color"
g "github.com/AllenDang/giu"
)
func loop() {
g.SingleWindow().Layout(
g.Custom(func() {
canvas := g.GetCanvas()
col := color.RGBA{0, 140, 140, 255}
canvas.AddLine(image.Pt(25, 25), image.Pt(100, 100), col, 1)
canvas.AddRect(image.Pt(160, 25), image.Pt(260, 115),
col, 5, g.DrawFlagsRoundCornersAll, 1)
canvas.AddRectFilled(image.Pt(330, 25),
image.Pt(430, 115), col, 5, 0)
canvas.AddCircleFilled(image.Pt(150, 250), 60, col)
canvas.AddTriangleFilled(image.Pt(330, 300),
image.Pt(450, 200), image.Pt(500, 300), col)
}),
)
}
func main() {
wnd := g.NewMasterWindow("Canvas", 450, 300,
g.MasterWindowFlagsNotResizable)
wnd.Run(loop)
}
在示例中,我们创建了一个画布小部件并绘制了一条线、两个矩形、一个圆和一个三角形。
g.Custom(func() {
画布放置在一个自定义小部件中。
canvas := g.GetCanvas()
我们使用 `g.GetCanvas` 获取当前窗口的画布。
col := color.RGBA{0, 140, 140, 255}
我们定义了一个颜色值。
canvas.AddLine(image.Pt(25, 25), image.Pt(100, 100), col, 1)
`AddLine` 函数在画布上绘制一条线。前两个参数是线的起点和终点。第三个参数是线的颜色。最后一个参数是线的粗细。
来源
在本文中,我们使用了 Go 中的 giu UI 库。