用Go写GUI程序

Wanjiongming 于 2020-02-29 发布

平时自己写的工具要么是网页,要么是命令行,使用起来还是感觉不够方便。于是就 Google 了下能够使用 Go 来写 GUI 的库

sciter-sdk/go-sciter

项目地址

Sciter 是一个用 HTML/CSS 来渲染现代应用程序 UI 的脚本引擎

使用方法,下载sciter-sdk,找到对应平台下的库文件比如 windows 系统就是bin.win/x64

把里面的库文件放到环境变量中,或者放置放在你的 Go 项目的同级目录

func setEventHandler(w *window.Window) {
  w.DefineFunction("getIp", func(args ...*sciter.Value) *sciter.Value {
    log.Println(args)
    ret := sciter.NewValue()
    ret.Set("ip", sciter.NewValue("127.0.0.1"))
    return ret
  })
}
func main() {
  w, err := window.New(sciter.SW_TITLEBAR|
    sciter.SW_RESIZEABLE|
    sciter.SW_CONTROLS|
    sciter.SW_MAIN|
    sciter.SW_ENABLE_DEBUG,
    nil)
  if err != nil {
    log.Panic(err)
  }
  layoutPath, _ := filepath.Abs("./hello.html")
  err = w.LoadFile(layoutPath)
  if err != nil {
    log.Panic(err)
  }
  w.SetTitle("Hello, world")
  // 添加交互事件
  setEventHandler(w)
  w.Show()
  // 运行窗口,进入消息循环
  w.Run()
}

页面布局

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <style>
      html,
      body {
        padding: 0;
        margin: 0;
      }
      li:hover {
        background-color: rgba(0, 0, 0, 0.2);
      }
    </style>
  </head>
  <body>
    <div>
      <button id="btn">Click Me</button>
    </div>
    <ul>
      <li>hello.html</li>
      <li>main.go</li>
      <li>sciter.dll</li>
    </ul>
    <script type="text/tiscript">
      $(#btn).on("click", function() {
        var result = view.getIp(1, "2");
        view.msgbox(result.ip);
      });
    </script>
  </body>
</html>

编译后发布给别人使用时,记得把 dll 文件,html 布局文件和可生成的可执行文件放到同级目录,当然也可以使用 go-bindata 工具包把这些一起打包为一个文件,再好一点可以使用 upx 把生成的二进制文件再压缩一下

go build -ldflags="-H windowsgui" main.go

sciter-demo

lxn/walk

项目地址

A Windows GUI toolkit for the Go Programming Language

通过 go 来调用 windows 的 API 来实现的 GUI,优点是效率高,缺点的话应该就是布局比较麻烦且不跨平台

ying32/govcl

项目地址

A Cross-platform Golang GUI library, Binding with Delphi VCL and Lazarus LCL.

调用 VCL 库来实现界面,可以跨平台。使用方法和 go-sciter 相似,都是通过调用相应平台的库来实现的,运行时库文件要在环境变量中存在

更多 GUI 库

zserge/lorca 网页作为 UI,调用本地的 Chrome

raintean/blink 网页作为 UI,内嵌 miniblink,和 Electron 类似,编译之后有点大

fyne-io/fyne

andlabs/ui