Golang GUI框架有哪些推荐

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

image

由于我考虑让我的软件跨平台,我计划摆脱对 rofi 的依赖,转而使用Go本身来显示提示。 我找到了两个可能实现此目标的框架:

我希望提示能够做到以下几点:

  • 显示一个列表
  • 接收文本输入
  • 分配一些提示应该检测到的热键
  • 应该“始终位于”其他窗口之上,并且不能有任何标题栏等

由于这是我第一次使用Go开发GUI,我希望得到一些帮助和推荐来开始。 提前感谢。


更多关于Golang GUI框架有哪些推荐的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

谢谢。我将从Fyne开始。

更多关于Golang GUI框架有哪些推荐的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


还需注意的是,除了被描述为处于中阿尔法阶段的用户界面外,该项目在过去两年内没有进行任何更新,很可能将一直保持中阿尔法状态。

你可以试试 https://gioui.org/

  • 跨平台:Windows/macOS/Linux/Android/iOS
  • 纯 Go 实现(无 CGO 依赖)

我稍微尝试了一下,它运行得相当不错。

在这两者中,fyne 看起来相当稳定,而 ui 自称是“中期 alpha 软件”

因此,我会从 fyne 开始,它似乎有一些 不错的文档

我已经尝试了上述提到的所有框架…每一个都试过了。

说实话…我用过的最好用的那个没有被提及。

我最喜欢的是QT绑定。它提供了大量的控件,虽然文档不多,但示例与其他语言(例如:C++、Python等)的示例非常相似。实际上,我昨晚在处理一个文件对话框问题时卡住了,直接搜索了C++的示例就解决了我的问题。

我使用Fyne为Roku遥控器制作了一个图形用户界面。

它相当不错,并且每个版本都在变得更好。

有些人可能会推荐GIO…我不喜欢那个库,因为它令人困惑、难以使用,而且文档也不够好。此外,使用它的示例非常少。所以我推荐Fyne。

我不太确定你具体在构建什么,但GTK在这里不是一个选项吗?GTK在Linux、Windows和macOS上都受支持。

GitHub图标 GitHub

头像

gotk3/gotk3

GTK3的Go语言绑定。通过在GitHub上创建账户来为gotk3/gotk3的开发做出贡献。

我对gotk3进行了一些尝试,在Go语言的GUI选项中,它确实不算差,不过当你开始与GUI代码交互时,通道的工作方式可能和你预期的不太一样……

如何在运行时构建包含控件列表的动态窗口?

来源: github.com/gotk3/gotk3

我尝试使用这个包来构建一个窗口,该窗口的内容需要在运行时动态更改。 我有……

标签: documentation


实际上,我计划使用 https://github.com/ultralight-ux/,并仅用C语言实现打开Ultralight窗口、系统托盘图标和右键菜单等基本功能,然后使用Go来驱动桌面端一个典型的Web前端……

我最初的想法是用gotk3实现所有功能,但当你与C语言库交互时,确实会牺牲掉Go语言的一些典型优势。

对于你的需求,特别是需要创建无标题栏、置顶的提示窗口,我推荐使用 Fyne。它跨平台支持好,且能相对容易地实现你描述的功能。以下是关键点分析和示例代码:

为什么推荐 Fyne?

  1. 跨平台:支持 Windows、macOS、Linux、甚至移动端。
  2. 易于定制:可以通过 Window.SetFixedSize(true) 和自定义主题去除标题栏,用 Window.SetPadded(false) 减少内边距。
  3. 热键支持:可通过 Canvas.SetOnTypedKey 监听键盘事件。
  4. 置顶窗口:使用 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
}

根据你的具体需求调整窗口大小、样式和热键即可。

回到顶部