从 andlabs/ui 到 go-sciter,到打包EXE二进制文件
ui选择
准备用go开发一个桌面UI,网上库比较多,我用到了两个。
- 开始使用andlabs/ui,后来放弃了,有以下几个原因:
- 首先是例子太少(4个)
- 其次就是缺少很多控件。比如我要做一个左侧导航栏,但是我只知道tab控件能实现顶层导航栏,最后还是用按钮才拼凑好这个功能
- 最终放弃的原因,就是效果图太单调,功能实现了,但是用户体验就不用说了
- 后来看go-sciter是通过加载html页面的方式,那应该可以满足我的需求了,懂html就可以了(实际上我不太会。。。),于是果断弃ui换sciter
go-sciter
一、环境准备
- 由于用到cgo,需要安装mingw
- 官网下载,很慢
https://sourceforge.net/projects/mingw/files/ - 现成的,windows+64bit
链接:https://pan.baidu.com/s/1Uns5TJGwEtXDgHGgpWZIfw
提取码:hk31
- 官网下载,很慢
- 配置sciter.dll
- 下载sciter-sdk
- 官网下载,很慢
https://sciter.com/download/ - 现成的
链接:https://pan.baidu.com/s/1EPqKaCRdiCAoo_fxVHefkQ
提取码:mejp
- 官网下载,很慢
- 解压
- 找到 sciter-sdk\bin\64\sciter.dll 复制到 c:\windows\system32
- 下载sciter-sdk
- get sciter
- go get -x github.com/sciter-sdk/go-sciter
- 进入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包
- go get -u github.com/jteeuwen/go-bindata/…
- go get -u github.com/elazarl/go-bindata-assetfs/…
- cd G O P A T H GOPATH GOPATH\github.com\jteeuwen\go-bindata\go-bindata
- go install
步骤二:按顺序来
- 新建一个目录res,把你的html文件放进去
- go-bindata -o res/bindata.go -pkg res res/
- 执行上面命令后发现你的res目录下生成了一个bindata.go文件
. - 引用 res/index.html 文件
bytes, _ := res.Asset("res/index.html")
w.LoadHtml(string(bytes),"")
- 打包:go build demo.go
- 现在可以放心的 go build 了,打完收工!