最近一直比较关注Golang的GUI解决办法。类似用H5的解决方法其实也看过,因为需要依赖指令的浏览器,前期放弃了。比如这个Lorca,它是依赖于Chrome的,需要运行之前安装Chrome浏览器。它不象其它一样会包含浏览器本身,会自动查找已经安装的此浏览器,只能说各有优缺点。
安装: go get -u https://github.com/zserge/lorca
Hello个World
package main
import (
"log"
"net/url"
"github.com/zserge/lorca"
)
func main() {
// Create UI with basic HTML passed via data URI
ui, err := lorca.New("data:text/html,"+url.PathEscape(`
<html>
<head><title>Hello</title></head>
<body><h1>Hello, world!</h1></body>
</html>
`), "", 480, 320)
if err != nil {
log.Fatal(err)
}
defer ui.Close()
// Wait until UI window is closed
<-ui.Done()
}
此库Star 5K以上,看起来还是比较不错。此作者还有通过WebView的库:https://github.com/zserge/webview,Star 6K以上。“Tiny cross-platform webview library for C/C++/Golang. Uses WebKit (Gtk/Cocoa) and Edge (Windows) "
Ubuntu中需要安装支持环境:sudo apt install webkit2gtk-4.0
蛋是,这个指令安装不了。至少在Ubuntu20下正确的应该是 sudo apt-get install libwebkit2gtk-4.0-dev.我差一点就自己去编译源代码了….
继续HelloWorld
package main
import "github.com/zserge/webview"
func main() {
debug := true
w := webview.New(debug)
defer w.Destroy()
w.SetTitle("我的博客")
w.SetSize(800, 600, webview.HintNone)
w.Navigate("http://i.scwy.net")
w.Run()
}
这样看起来是个界面,实际上是一个网页。小问题在于:它还有右键,通过代码看是否能屏蔽。
在所以窗口加载之前(window.onload)运行一个屏蔽脚本
w.Init("document.oncontextmenu=new Function('event.returnValue=false;');document.onselectstart=new Function('event.returnValue=false;');")
可以了,右键出不来了。
看看它的另一个例子,调用golang中定义的函数
package main
import (
"log"
"github.com/zserge/webview"
)
func main() {
w := webview.New(true)
defer w.Destroy()
w.SetTitle("Hello")
w.Bind("noop", func() string {
log.Println("hello")
return "hello"
})
w.Bind("add", func(a, b int) int {
return a + b
})
w.Bind("quit", func() {
w.Terminate()
})
w.Navigate(`data:text/html,
<!doctype html>
<html>
<body>hello</body>
<script>
window.onload = function() {
document.body.innerText = ` + "`hello, ${navigator.userAgent}`" + `;
noop().then(function(res) {
console.log('noop res', res);
add(1, 2).then(function(res) {
console.log('add res', res);
//quit(); //原示例是没有注释掉这一句的,即计算完了就退出
});
});
};
</script>
</html>
)`)
w.Run()
}
看起来挺好,不过你以为这样就完了,并不。我需要的是中文。
将第一个例子稍修改: w.SetTitle(“我的博客\u4e2d\u6587浏览器名”)
结果没有问题,\u4e2d\u6587正确显示为“中文”两字。
将第二个例子稍修改:
document.body.innerText = + "
hello, 什么 ${navigator.userAgent}, \u4e2d\u6587浏览器名: ${navigator.appName}" +
;
然后,它显示出来是问号或者ÿÿÿÿÿÿ。即使我存为文件,然后调入,效果也是一样。累…
关于此库,网友的文章.
经过测试,以下存入文件,函数等正常,但${navigator.userAgent}就不能使用了。中文正常了。
w.Navigate(“file:///。。。。。/t.html”) 使用本地路径调用。算是解决了吧。
<!doctype html>
<html>
<meta charset="UTF-8">
<body>hello</body>
<script>
window.onload = function() {
document.body.innerText = "人";
noop().then(function(res) {
console.log('noop res', res);
add(1, 2).then(function(res) {
console.log('add res', res);
//quit(); //原示例是没有注释掉这一句的,即计算完了就退出
});
});
};
</script>
</html>