sciter笔记
sciter是用C++实现的一个老牌的、快速小巧的、跨平台的gui方案。界面采用HTML + CSS + script方式实现。除了C++外,还支持多种语言绑定。
go-sciter:当前版本跑基本示例代码报错,搜索到的解决方案为在mod文件中手工指定最新的fix提交版本。
rust-sciter:当前版本可以跑通示例代码,且rust语言写一些小工具啥的非常棒。奈何rust语言内容比go复杂太多,静不下心来学习。
scitersharp:C#绑定,支持与winform,wpf等集成。但我在跑示例程序时碰到一些异常不知道咋解决。
下面的笔记都是以go-sciter为例来写的。
1、sciter不支持H2的charset设置,即
<meta charset="utf-8"> // 这种不行
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> // 需要写这种H4的方式
2、占满整个窗口:经测试,设置width和height为100%不起作用。sciter的做法是设置size参数为 " * "
body {
margin: 0;
background-color: lightblue;
size: *; // body会占满整个窗口
}
3、sciter用flow配合size来实现flex box效果。
nav {
background-color: lightblue;
flow: horizontal; // 内部元素会横向分布,从左到右
width: *; // 占满整个宽度
height: *; // 占满整个高度
}
特别是配合grid()时,可以非常方便的布局
section {
size:*;
flow:grid(1 1 1, //实现有header,footer ,双侧边栏,主内容区的布局方式
2 5 3,
4 4 4);
}
4、资源文件打包
sciter界面是由html、css、tis脚本等描述的。当用户程序发布时,必须同时携带这些资源文件。而go语言编写的程序一般是单个可执行文件分发的。可以通过下面的方式,将资源文件打包进可执行文件中。
import ( "fmt" rice "github.com/GeertJohan/go.rice" "github.com/fatih/color" "github.com/sciter-sdk/go-sciter" sciter_rice "github.com/sciter-sdk/go-sciter/rice" "github.com/sciter-sdk/go-sciter/window" ) func main() { // 打包静态资源 rice.MustFindBox("ui") // 假设资源文件都在项目根目录下的ui文件夹中 rect := sciter.NewRect(100, 100, 600, 480) w, err := window.New(sciter.DefaultWindowCreateFlag, rect) if err != nil { color.RedString("Failed to generate sciter window ", err.Error()) } sciter_rice.HandleDataLoad(w.Sciter) // 窗口初始化后,调用go-sciter的rice封装 err = w.LoadFile("rice://ui/main.html") // 通过rice加载需要的资源 if err != nil { color.RedString("Failed to load ui file ", err.Error()) } w.SetTitle("Simple rice") w.Show() w.Run() }
// 1、先 go get github.com/GeertJohan/go.rice/rice 安装rice命令
// 2、在go程序文件所在的目录执行: rice embed 命令即可生成名为rice-box.go的资源文件。
// 3、之后再执行 go build编译出的可执行文件将携带所需的资源文件。
5、编译出来的exe还需要sciter.dll等动态库才能正确运行,动态链接库不容易打包到可执行文件中。可以采取打包到一个压缩包的形式来发布绿色版,Window下也可以做成安装程序或者做成自解压rar程序。