Walk是一个写给Golang的Window应用程序库套件,它主要用于桌面GUI的开发,但也有更多的东西。

划重点:walk是windows上的gui库,不能跨平台。 不过受益于golang语言的特性,最终打包体积很小,界面颜值也很高,如果只在windows上用用,那还是非常棒的。

walk 的项目地址: https://github.com/lxn/walk
文档地址:https://godoc.org/github.com/lxn/walk

一、 安装walk模块

默认你是个GO语言的老手,已经配置好了golang的开发环境,有了自己趁手的ide。这里我直接说怎么使用walk开发GUI程序。

在开始之前请确保你的golang版本在1.11之上

Walk官方声明 : 限只支持 golang 1.11.x 以上的版本,1.11.x以下的已经不支持了

go的依赖库有2种安装方式

  1. 第一种,使用go get进行安装
go get github.com/lxn/walk
%GOPATH%\src\github.com\lxn\walkgo install github.com\lxn\walk

二、创建项目

1. OSSTool工具简介

作为一个文件上传的客户端,支持两种方式上传文件

  • 快捷键直接上传
  • 拖动文件到指定区域上传

软件启动后直接最小化到系统托盘,支持在托盘图标上右键打开菜单,选择进入主界面,进行秘钥配置和文件拖动上传等功能。

2. 启动入口

go mod init

在项目下新建一个main.go文件,作为主函数,监听系统快捷键和生成托盘图标、监听点击事件等,main.go 内容如下:

package main

import (
	"fmt"
	"ossTool/views"

	"github.com/MakeNowJust/hotkey"
	"github.com/getlantern/systray"
)

func main() {
	//RunHomeWindow(); //运行主窗口
	//启动快捷键监听
	go func() {
		hkey := hotkey.New()
		hkey.Register(hotkey.Ctrl, 'U', func() {
			fmt.Println("Push Ctrl+U")
		})
	}()

	systray.Run(views.OnReady, views.OnExit) //运行托盘菜单
}

3. 系统托盘

在系统托盘中,定义图标、标题和提示文字

systray.SetTemplateIcon(appIcon.LogoIcon, appIcon.LogoIcon)
systray.SetTitle("OssTool")
systray.SetTooltip("OssTool")

定义托盘图标的右键菜单

runWindow := systray.AddMenuItem("主界面", "Open the main window")
systray.AddSeparator()
mdCopy := systray.AddMenuItem("复制md格式", "copy for markdown")
systray.AddSeparator()
mURL := systray.AddMenuItem("文档地址", "visit the home page")
systray.AddSeparator()
mQuit := systray.AddMenuItem("退出程序", "Quit the whole app")

异步监听托盘图标的菜单项点击事件

go func() {
	for {
		select {
		case <-runWindow.ClickedCh:
			go func() {
				RunHomeWindow(mw) //运行主窗口
			}()

		case <-mdCopy.ClickedCh:
			if mdCopy.Checked() {
				mdCopy.Uncheck() //取消选中
				mdFlag = false

			} else {
				mdCopy.Check() //选中
				mdFlag = true
			}
		case <-mURL.ClickedCh:
			open.Run("https://www.cnblogs.com/ludg/")
		case <-mQuit.ClickedCh:
			systray.Quit() //退出托盘
			return
		}
	}
}()

4. 主界面

菜单栏中,点击选项可配置oss的授权信息

三、安装 rsrc

代码写好后,我们直接go build打包是不行的,golang的图形exe需要依赖于manifest 清单文件才能正常运行。要把manifest嵌入exe文件中,还需要一个工具:rsrc

go get github.com/akavel/rsrc

四、创建 manifest 文件

main.manifest 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

五、生成 rsrc.syso

rsrc -manifest main.manifest -o rsrc.syso

六、打包成exe并去掉cmd守护

go build -ldflags="-H windowsgui"

此时,打开项目下的exe文件运行即可