网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。

使用go语言的Console UI

2020-06-10 02:54:30 admin 1482

go语言的GUI是一大短板,至今没有官方的跨平台GUI,第三方GUI库虽然有一些,例如QT/GTK/wxWidget的绑定,但是跨平台编译还是麻烦。如果我们只是需要一个简单的GUI,那么可以使用Console UI,今天我推荐一个很不错的Console UIgocui,经本人试用,没有额外依赖关系,完全可以在linux平台编译win32程序。

如何安装

它的源代码地址(包引用路径)是:github.com/jroimartin/gocui。但是该程序的中文支持不好,显示中文字符时会漏掉一半文字,因此我给它打了一个补丁,因为该补丁还未被合并到主线中,请从:github.com/rocket049/gocui或者https://gitee.com/rocket049/gocui.git下载源代码,然后复制到目录:GOPATH/src/github.com/jroimartin/gocui

打了补丁的程序和原程序有2个区别:

  1. 可以正确显示中文;
  2. 多了一个专门用于从编辑窗口读入中文的函数:(v *View) ReadEditor() []byte,该函数用于还原输入的中文语句。

如何使用

我就以一个简单的输入、显示程序做一个例子:

__

  1. //Try cjk patch. example of view.ReadEditor
  2. package main
  3. import (
  4. "fmt"
  5. "log"
  6. "github.com/jroimartin/gocui"
  7. )
  8. // 输出窗口
  9. func viewOutput(g *gocui.Gui, x0, y0, x1, y1 int) error {
  10. v, err := g.SetView("out", x0, y0, x1, y1)
  11. if err != nil {
  12. if err != gocui.ErrUnknownView {
  13. return err
  14. }
  15. v.Wrap = true
  16. v.Overwrite = false
  17. v.Autoscroll = true
  18. v.SelBgColor = gocui.ColorRed
  19. v.Title = "Messages"
  20. }
  21. return nil
  22. }
  23. // 输入窗口(编辑器)
  24. func viewInput(g *gocui.Gui, x0, y0, x1, y1 int) error {
  25. if v, err := g.SetView("main", x0, y0, x1, y1); err != nil {
  26. if err != gocui.ErrUnknownView {
  27. return err
  28. }
  29. v.Editable = true
  30. v.Wrap = true
  31. v.Overwrite = false
  32. if _, err := g.SetCurrentView("main"); err != nil {
  33. return err
  34. }
  35. fmt.Fprintf(v, "example,中文输入示例,按回车输入。press ENTER to input。Ctrl-C 退出")
  36. }
  37. return nil
  38. }
  39. // 显示输出、输入窗口
  40. func layout(g *gocui.Gui) error {
  41. maxX, maxY := g.Size()
  42. if err := viewOutput(g, 1, 1, maxX-1, maxY-4); err != nil {
  43. return err
  44. }
  45. if err := viewInput(g, 1, maxY-3, maxX-1, maxY-1); err != nil {
  46. return err
  47. }
  48. return nil
  49. }
  50. // 退出函数
  51. func quit(g *gocui.Gui, v *gocui.View) error {
  52. return gocui.ErrQuit
  53. }
  54. func main() {
  55. g, err := gocui.NewGui(gocui.OutputNormal)
  56. if err != nil {
  57. //log.Panicln(err)
  58. }
  59. g.Cursor = true
  60. g.Mouse = false
  61. g.ASCII = false
  62. g.SetManagerFunc(layout)
  63. if err := g.SetKeybinding("main", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
  64. log.Panicln(err)
  65. }
  66. if err := g.SetKeybinding("main", gocui.KeyEnter, gocui.ModNone, updateInput); err != nil {
  67. log.Panicln(err)
  68. }
  69. if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
  70. log.Panicln(err)
  71. }
  72. g.Close()
  73. }
  74. //updateInput 当按下ENTER键时调用,把输入的内容复制到输出窗口中
  75. func updateInput(g *gocui.Gui, cv *gocui.View) error {
  76. v, err := g.View("out")
  77. if cv != nil && err == nil {
  78. var p = cv.ReadEditor()
  79. if p != nil {
  80. v.Write([]byte("你:"))
  81. v.Write(append(p, '\n'))
  82. }
  83. v.Autoscroll = true
  84. }
  85. l := len(cv.Buffer())
  86. cv.MoveCursor(0-l, 0, true)
  87. cv.Clear()
  88. return nil
  89. }

效果如何

下面的图片就是我用该程序做的的一个匿名聊天程序界面:

匿名聊天程序

匿名聊天程序的源代码

转载文章,原文链接: 使用go语言的Console UI

关键字词goConsole

分享到:

如需留言,请 登录,没有账号?请 注册

0 条评论 0 人参与

顶部 底部