(原) Golang之GUI:尝试 Lorca

原创文章,请后转载,并注明出处。

最近一直比较关注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>		

相关文章