从 andlabs/ui 到 go-sciter,到打包EXE二进制文件 - Go语言中文社区

从 andlabs/ui 到 go-sciter,到打包EXE二进制文件


ui选择

准备用go开发一个桌面UI,网上库比较多,我用到了两个。

  1. 开始使用andlabs/ui,后来放弃了,有以下几个原因:
    • 首先是例子太少(4个)
    • 其次就是缺少很多控件。比如我要做一个左侧导航栏,但是我只知道tab控件能实现顶层导航栏,最后还是用按钮才拼凑好这个功能
    • 最终放弃的原因,就是效果图太单调,功能实现了,但是用户体验就不用说了
  2. 后来看go-sciter是通过加载html页面的方式,那应该可以满足我的需求了,懂html就可以了(实际上我不太会。。。),于是果断弃ui换sciter

go-sciter

一、环境准备

  1. 由于用到cgo,需要安装mingw
  2. 配置sciter.dll
  3. get sciter
  4. 进入sciter库,就可以运行sciter库里面的例子了
    在这里插入图片描述

问题:当你运行时,可能出现hello world,而是一片空白

解决:go-sciter支持相对路径有问题,所以请配成绝对路径,再试试

二、sciter实现前后端交互

废话不多说,直接上代码

package main

import (
   "fmt"
   "github.com/sciter-sdk/go-sciter"
   "github.com/sciter-sdk/go-sciter/window"
   "log"
   "math/rand"
   "mygo/kalf/res"
   "time"
)

// 输出一个随机数
func getb1() int {
   rand.Seed(time.Now().UnixNano())
   return rand.Int()
}

func uiToBack(root *sciter.Element)  {
   button1,_ := root.SelectById("button1")
   button1.DefineMethod("test1", func(args ...*sciter.Value) *sciter.Value {
      for _,arg := range args{
         fmt.Println("获取到前端的参数:",arg)
      }
      return sciter.NullValue()
   })
}

func BackToUi(w *window.Window)  {
   w.DefineFunction("test2", func(args ...*sciter.Value) *sciter.Value{
      return sciter.NewValue(getb1())
   })
}

func defFunc(w *window.Window) {
   //注册reg函数,用于处理注册逻辑,这里只是简单的把数据打印出来
   w.DefineFunction("postData", func(args ...*sciter.Value) *sciter.Value {
      for _, v := range args {
         //fmt.Print(v.String() + " ")
         fmt.Println("11111",v)
      }
      fmt.Println()
      return sciter.NullValue()
   })
}

func loadImg(root *sciter.Element)  {
   img, _ := root.SelectById("img")
   img.AttachEventHandler(&sciter.EventHandler{
      //OnDataArrived 当资源被加载但未使用时调用
      OnDataArrived: func(he *sciter.Element, params *sciter.DataArrivedParams) bool {
         //设置属性,给img标签设置src
         he.SetAttr("src", params.Uri())
         return false
      },
   })
   img.Load("https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1395977027,165040144&fm=26&gp=0.jpg", sciter.RT_DATA_IMAGE)
}

func main() {
   w, err := window.New(sciter.DefaultWindowCreateFlag, &sciter.Rect{100,100,1000,800})
   if err != nil {
      log.Fatal(err)
   }

   bytes, _ := res.Asset("res/index.html")
   w.LoadHtml(string(bytes),"")
   //设置标题
   w.SetTitle("元素加载内容")

   root,_ := w.GetRootElement()
   fmt.Println(root)
   //后台数据到前端
   BackToUi(w)
   // 前端数据到后端
   uiToBack(root)
   // 提交表单
   defFunc(w)
   // 加载后台图片
   loadImg(root)

   w.Show()
   w.Run()
}
代码很简单,我就不说了,有问题请移步评论区,谢谢!

三、打包成exe

为什么要拿在这里说呢,因为加载的html跟配置文件一个道理,默认是打包不进二进制文件中的

我这里主要做了三次尝试,前两次失败,最后一次打包成功了,都分享出来,或供借鉴或求指正

1. 整个html定义成一个字符串,加载html文件函数改成

// w.LoadFile("C:/Users/zy/go/src/github.com/sciter-sdk/go-sciter/examples/demoes/01/demo1.html")
w.LoadHtml(htmlStr,"")
结果就是

在这里插入图片描述
乱码原因我也不知道,也没有解决,求大神解惑

2.用sciter自带的rice打包

网上有教程,我就不说我的失败操作步骤了,有成功的希望大家可以告知

3.用go-bindata打包

步骤一:安装go-bindata包
  1. go get -u github.com/jteeuwen/go-bindata/
  2. go get -u github.com/elazarl/go-bindata-assetfs/
  3. cd GOPATHGOPATHgithub.comjteeuwengo-bindatago-bindata
  4. go install
步骤二:按顺序来
  1. 新建一个目录res,把你的html文件放进去
  2. go-bindata -o res/bindata.go -pkg res res/
  3. 执行上面命令后发现你的res目录下生成了一个bindata.go文件
    .在这里插入图片描述
  4. 引用 res/index.html 文件
bytes, _ := res.Asset("res/index.html")
w.LoadHtml(string(bytes),"")
  1. 打包:go build demo.go
    哈哈,天空好蓝
  2. 现在可以放心的 go build 了,打完收工!
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40421573/article/details/99432067
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢