我们使用 go-sciter,就不得不提 Sciter,Sciter 是一个嵌入式的 HTML/CSS 脚本引擎,旨在为桌面应用创建一个 UI 框架层。
说简单点就是我们通过它可以像写html,css那样写桌面UI。
一、环境准备
第一步:从 https://sciter.com/download/ 地址下载 sciter-sdk
1. 解压,找到 sciter-sdk\bin\64\sciter.dll 复制到 C:\Windows\System32 或 编译二进制文件的同级目录
注意上面的请根据你自已的系统选择相应文件
第二步:由于使用到 cgo,所以 Windows 下需要安装 Mingw-w64
1. MinGW 下载地址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
把下载后的 Mingw-w64\bin 目录加入到环境变量中
第三步:cmd 进入gopath目录并运行
1. go get -x github.com/sciter-sdk/go-sciter
二、通过html,css编写简单UI
demo1.go 代码如下:
package main
import (
"github.com/sciter-sdk/go-sciter"
"github.com/sciter-sdk/go-sciter/window"
"log"
)
func main() {
//创建window窗口
//参数一表示创建窗口的样式
//SW_TITLEBAR 顶层窗口,有标题栏
//SW_RESIZEABLE 可调整大小
//SW_CONTROLS 有最小/最大按钮
//SW_MAIN 应用程序主窗口,关闭后其他所有窗口也会关闭
//SW_ENABLE_DEBUG 可以调试
//参数二表示创建窗口的矩形
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.Fatal(err);
}
//加载文件
w.LoadFile("demo1.html");
//设置标题
w.SetTitle("你好,世界");
//显示窗口
w.Show();
//运行窗口,进入消息循环
w.Run();
}
demo1.html代码如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
</head>
<body>
你好,世界
</body>
</html>
如果出现乱码请把demo1.html文件编码格式转成转成UTF-8+BOM(注意是加BOM)。
三、写个表单的UI
demo2.go代码如下:
package main
import (
"github.com/sciter-sdk/go-sciter"
"github.com/sciter-sdk/go-sciter/window"
"log"
)
func main() {
//创建window窗口
//参数一表示创建窗口的样式
//SW_TITLEBAR 顶层窗口,有标题栏
//SW_RESIZEABLE 可调整大小
//SW_CONTROLS 有最小/最大按钮
//SW_MAIN 应用程序主窗口,关闭后其他所有窗口也会关闭
//SW_ENABLE_DEBUG 可以调试
//参数二表示创建窗口的矩形
w, err := window.New(sciter.SW_TITLEBAR|
sciter.SW_RESIZEABLE|
sciter.SW_CONTROLS|
sciter.SW_MAIN|
sciter.SW_ENABLE_DEBUG,
//给窗口设置个大小
&sciter.Rect{Left: 0, Top: 0, Right: 500, Bottom: 500});
if err != nil {
log.Fatal(err);
}
//加载文件
w.LoadFile("demo2.html");
//设置标题
w.SetTitle("表单");
//显示窗口
w.Show();
//运行窗口,进入消息循环
w.Run();
}
demo2.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表单</title>
<style>
table {
width: 100%;
border-collapse: collapse;
}
table td {
padding: 10px;
border: 1px solid #ccc;
}
table td:first-child {
white-space:nowrap;
}
</style>
</head>
<body>
<form action="">
<table>
<tr>
<td>用户:</td>
<td><input type="text"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password"></td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" value="0">男
<input type="radio" value="1">女
</td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" value="">看书
<input type="checkbox" value="">打球
<input type="checkbox" value="">旅游
</td>
</tr>
<tr>
<td>简介:</td>
<td>
<textarea name="" id="" cols="30" rows="10"></textarea>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
关于一些问题的说明:
w.LoadFile() 无法加载相对路径的文件,请确保你运行程序的目录是否正确。
比如新版本的GoLand,在你右键Run时,程序所指向的目录是你 New Project 时设置 Location 的目录,而不是此时 go脚本 所在的目录。
使用go-sciter创建的exe经常会出现未响应的现象,
是因为 golang 的协程会在多个线程乱跳,导致 ui 操作也跳到别的线程了。
解决办法:在 init 加上 runtime.LockOSThread()
如 html 无法正确加载可使用 go-bindata 打包为二进制数据直接引用
1. 安装Go-bindata
2. go get -u github.com/jteeuwen/go-bindata/
3. 把 go-bindata.exe 加入环境变量
4. cmd 进入 src 目录 输入以下命令 go-bindata -o demo/bindata.go -pkg main demo/
-o 输出文件到 demo/bindata.go 包名 -pkg demo 然后是需要打包的目录 main/ 三个点包括所有子目录
这样就可以把所有相关文件打包到 bindata.go 而且开头是 package main 保持和目录一致。
使用方法:
把 w.LoadFile("demo1.html") 改为
bytes, _ := Asset("demo/demo1.html")
w.LoadHtml(string(bytes), ""