Go语言设计实现在任务栏里提醒你喝水的兔子
六号积极分子 人气:0前言
之前看到 RunCat 一只可以在电脑上奔跑猫,其主要的功能是监控电脑的CPU、内存的使用情况,使用越多跑的越快。所以准备做一只在任务栏里的兔子,主要使用 Go 语言实现一个简单的到点拜年的兔子。
详细设计
基本需求:
- 打开应用时可以在任务栏里显示
- 实现动态兔子生成
实现一只在任务栏里的兔子。基本就是一个应用的图标,并且图标是动态变化的。使用 Go 开发的话可以使用 systray 工具包,能够支持在任务栏里显示图标。
go get github.com/getlantern/systray
需要使用 goV1.12版本以上。安装完后就可以在 main 文件中加入方法
func main() { systray.Run(onReady, onExit) } func onReady() { systray.SetIcon(icon.Data) // systray.SetTitle("HappyRabbit") systray.SetTooltip("Happy New Year") mQuit := systray.AddMenuItem("Quit", "退出应用") mTip1 := systray.AddMenuItem("change", "图标更新") go func() { for { select { case <-mQuit.ClickedCh: systray.Quit() return case <-mTip1.ClickedCh: var data [][]byte picData := getIcon() systray.SetIcon(picData) } } }() }
以上代码就是打开应用时先使用默认的图标,点击图标更新时就可以实现图标的变更。主要使用了设置图标的方法是 systray.SetIcon([]byte)
。
需要注意,如果不是使用 ico 格式的图标可能会发生以下的错误:
ERROR systray: systray_windows.go:845 Unable to set icon: The volume for a file has been externally altered so that the opened file is no longer valid.
完成图标更新的需求后就可以进一步实现动态图标变更,从而实现一只能动的拜年兔子。实现动态化基本思路就是多张动作图片不断地循环从而实现动态。简单的实现就是可以将多个图片都加载进来,然后使用循环:
var data [][]byte data1, _ := getIcon("./images/1.ico") data2, _ := getIcon("./images/4.ico") data3, _ := getIcon("./images/5.ico") data = append(data, data1) data = append(data, data2) data = append(data, data3) go func() { // 异步处理 index := 0 for { systray.SetIcon(data[index]) time.Sleep(time.Second * 2) index++ if index == 2 { index = 0 } } }()
以上更好的方式,我觉得可以使用 corn 定时任务去执行,这样就可以对定时任务进行控制,想开就开,想关就关。
基本实现到这里就是完成了一个简单的任务栏显示功能,但我在里面增加一个可以定时通过 webhook 方式给自己的飞书通知消息,提醒该喝水了。
详细飞书 webhook 的方式可以参考自己写过的文章:https:
安装包
开发完之后就可以进行编译。不同的平台编译生成安装包还是不一样的。但在编译的时候还需要注意不同环境的区别:
首先需要打开环境配置:
env GO111MODULE=on go build
Window
go build -ldflags -H=windowsgui
MacOS
在macOS,需要先创建一个应用程序二进制包包装;基本的文件配置是
SystrayApp.app/ Contents/ Info.plist MacOS/ go-executable Resources/ SystrayApp.icns
这里主要实现了在任务栏兔子生成的效果,可以继续迭代升级,比如监控系统的状态、或者进行一些异步的工作,通知事件或者其他的功能。因为我不擅长做UI所以就没有实现更加壮观的结果。以上就是我实现的整个过程,有任何问题欢迎指正。
效果展示
加载全部内容