Golang GUI框架有哪些推荐
Golang GUI框架有哪些推荐
所以,我构建了这个CLI应用程序,它使用 rofi 作为dmenu来显示最小化的提示,如下所示:

由于我考虑让我的软件跨平台,我计划摆脱对 rofi 的依赖,转而使用Go本身来显示提示。
我找到了两个可能实现此目标的框架:
我希望提示能够做到以下几点:
- 显示一个列表
- 接收文本输入
- 分配一些提示应该检测到的热键
- 应该“始终位于”其他窗口之上,并且不能有任何标题栏等
由于这是我第一次使用Go开发GUI,我希望得到一些帮助和推荐来开始。 提前感谢。
更多关于Golang GUI框架有哪些推荐的实战教程也可以访问 https://www.itying.com/category-94-b0.html
还需注意的是,除了被描述为处于中阿尔法阶段的用户界面外,该项目在过去两年内没有进行任何更新,很可能将一直保持中阿尔法状态。
在这两者中,fyne 看起来相当稳定,而 ui 自称是“中期 alpha 软件”。
因此,我会从 fyne 开始,它似乎有一些 不错的文档。
我已经尝试了上述提到的所有框架…每一个都试过了。
说实话…我用过的最好用的那个没有被提及。
我最喜欢的是QT绑定。它提供了大量的控件,虽然文档不多,但示例与其他语言(例如:C++、Python等)的示例非常相似。实际上,我昨晚在处理一个文件对话框问题时卡住了,直接搜索了C++的示例就解决了我的问题。
我使用Fyne为Roku遥控器制作了一个图形用户界面。
它相当不错,并且每个版本都在变得更好。
有些人可能会推荐GIO…我不喜欢那个库,因为它令人困惑、难以使用,而且文档也不够好。此外,使用它的示例非常少。所以我推荐Fyne。
我不太确定你具体在构建什么,但GTK在这里不是一个选项吗?GTK在Linux、Windows和macOS上都受支持。
gotk3/gotk3
GTK3的Go语言绑定。通过在GitHub上创建账户来为gotk3/gotk3的开发做出贡献。
对于你的需求,特别是需要创建无标题栏、置顶的提示窗口,我推荐使用 Fyne。它跨平台支持好,且能相对容易地实现你描述的功能。以下是关键点分析和示例代码:
为什么推荐 Fyne?
- 跨平台:支持 Windows、macOS、Linux、甚至移动端。
- 易于定制:可以通过
Window.SetFixedSize(true)和自定义主题去除标题栏,用Window.SetPadded(false)减少内边距。 - 热键支持:可通过
Canvas.SetOnTypedKey监听键盘事件。 - 置顶窗口:使用
Window.SetMaster()或Window.SetOnTop()(取决于平台)实现。
示例代码:一个简单的提示窗口
这个示例创建了一个无标题栏、置顶的窗口,包含输入框、列表,并监听热键(如 Ctrl+Q 退出)。
package main
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"fyne.io/fyne/v2/driver/desktop"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Prompt")
// 移除标题栏并置顶(Linux/macOS 可能需要额外处理)
myWindow.SetFixedSize(true)
myWindow.SetPadded(false)
myWindow.SetMaster() // 尝试置顶,部分平台可能需用 SetOnTop()
// 输入框
entry := widget.NewEntry()
entry.SetPlaceHolder("Type here...")
// 列表
listItems := []string{"Option 1", "Option 2", "Option 3"}
list := widget.NewList(
func() int {
return len(listItems)
},
func() fyne.CanvasObject {
return widget.NewLabel("template")
},
func(i widget.ListItemID, o fyne.CanvasObject) {
o.(*widget.Label).SetText(listItems[i])
},
)
// 热键监听:Ctrl+Q 退出
if deskCanvas, ok := myWindow.Canvas().(desktop.Canvas); ok {
deskCanvas.SetOnKeyDown(func(ev *fyne.KeyEvent) {
if ev.Name == fyne.KeyQ && (ev.Modifier & fyne.KeyModifierControl) != 0 {
myApp.Quit()
}
})
}
// 布局:输入框在上,列表在下
content := container.NewBorder(entry, nil, nil, nil, list)
myWindow.SetContent(content)
myWindow.Resize(fyne.NewSize(400, 300))
myWindow.ShowAndRun()
}
注意事项
- 置顶窗口:Fyne 的
SetMaster()或SetOnTop()可能因平台而异,需测试目标系统。 - 无边框窗口:完全去除标题栏可能需要平台特定代码,Fyne 的
Window.SetFixedSize(true)通常能隐藏最大化/最小化按钮。 - 热键:示例使用了
desktop.Canvas接口,确保在桌面环境下运行。
备选方案:andlabs/ui
andlabs/ui 更轻量,但已停止维护,跨平台可能遇到问题。如果只针对 Linux,它可能足够,但考虑到你的跨平台需求,Fyne 更可靠。
扩展建议
要实现类似 rofi 的模糊搜索,可在输入框的 OnChanged 回调中过滤列表:
entry.OnChanged = func(text string) {
// 根据 text 过滤 listItems 并更新 list
}
根据你的具体需求调整窗口大小、样式和热键即可。


