Go语言设计实现在任务栏里提醒你喝水的兔子
作者:六号积极分子 发布时间:2023-07-15 04:24:22
前言
之前看到 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 方式给自己的飞书通知消息,提醒该喝水了。
安装包
开发完之后就可以进行编译。不同的平台编译生成安装包还是不一样的。但在编译的时候还需要注意不同环境的区别:
首先需要打开环境配置:
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所以就没有实现更加壮观的结果。以上就是我实现的整个过程,有任何问题欢迎指正。
效果展示
来源:https://juejin.cn/post/7186504459214651450


猜你喜欢
- HTML代码如下,其中,要拖动的div为最外层的div <div id="dialog_createUserGroup&qu
- CREATE TABLE table1( [ID] [bigint] IDENTITY(1,1) NOT NULL, [Name] [nva
- 前言:Unittest又名单元测试,主要用于测试自己写的代码的正确性和完备性,也方便自己和他人对代码的维护。在软件开发过程中,测试驱动开发的
- mysql可以通过下面语句判断是否支持分区:SHOW VARIABLES LIKE '%partition%';如果输出:h
- 本文实例讲述了Python求解平方根的方法。分享给大家供大家参考。具体如下:主要通过SICP的内容改写而来。基于newton method求
- 实战场景经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么?super(
- 原理python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现流程C++共享内存打包成库python调用C++库往共享
- 本文和大家重点讨论一下Perl哈希表的概念,Perl语言和其他编程语言各有各的特点,这里和大家分享一下Perl哈希表的概念,其实Perl哈希
- 前言kettle通过域名或者IP连接Oracle,本地不需要安装Oracle,但是要把Oracle的驱动jar包复制到kettle的lib目
- system默认:managersys默认:change_on_install使用SQL Plus登录数据库时,system使用密码mana
- 问题某些无聊的脚本小子在Web页面表单中填入了“pýtĥöñ”这样的文本,我们
- 随笔:(1) 命名空间
- 一、前期配置 1. 加入依赖<dependency> <groupId>co
- 总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。python没有二进制类型,但可以存储二进
- 第一种打开PyCharm, 然后PyCharm -> Preferences -> 在搜索框中输入Project Interpr
- 简介增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量备份的对象是进
- 在利用torch.max函数和F.Ssoftmax函数时,对应该设置什么维度,总是有点懵,遂总结一下:首先看看二维tensor的函数的例子:
- 一、面向对象三大特征之继承python三大特征:封装、继承、多态三者中继承最为核心,实际应用多,感受较为直观封装和多态略微抽象1、继承的概念
- 基本原理使用Adodb.Stream读二进制文件然后进行解析,然后返回一数组第一个元素为类型(BMP JPG PNG GIF SWF)第二个
- 前段时间做一个小项目碰到了一个导航制作的方式然后突然想到曾经很久以前看到的梯形状的不规则导航,就尝试做了一下。结果碰到了几个问题,后来在同事