目录
一、前言
- 一、前言
- 二、准备工作
- 三、创建工程
- 四、处理logo
- 五、编写主程序
- 六、编译运行
- 七、设置开机自动运行
- 八、注销重登录
作为一个刚接触Go语言的初学者,总得写点代码练习一下。考虑到自身需求,就写了个这么一个小工具。记录在这里和大家一起分享,给有需求的同志提供一点参考。
这个工具很简单,用网上现成的库,并将附带的示例稍微修改下就可以了。
二、准备工作- 打开https://github.com/getlantern/systray并git clone,我们工作就是在它给出的example中进行修改。
- 网上下载一张以太坊的Logo(PNG格式的)
- 安装最新版本go(1.13以上)并设置GOPATH,这个可以去官网看教程
- 设置
GOPROXY="https://goproxy.io"
。建议在.bash_profile
里设置。
打开终端,建立工程目录并使用go module
。如下示例:
➜ ~ cd work/
➜ work mkdir ethprice
➜ work cd ethprice/
➜ ethprice go mod init ethprice
go: creating new go.mod: module ethprice
➜ ethprice
注意这里的work
不要在GOPATH
目录下。使用vscode打开刚才的ethprice
文件夹,在根目录下建立main.go
文件和icon
文件夹,并将以太坊logo改名为logo.png
放入icon
文件夹下。将如下图:
将前面下载的systray中example\icon\make_icon.sh
也copy到icon目录下。在vscode里打开终端,切换到该目录并运行sh ./make_icon.sh logo.png
,它会在当前目录下生成一个iconunix.go
的文件,这就是我们小工具所需要的logo。下面是make_icon.sh
里的代码:
#/bin/sh
if [ -z "$GOPATH" ]; then
echo GOPATH environment variable not set
exit
fi
if [ ! -e "$GOPATH/bin/2goarray" ]; then
echo "Installing 2goarray..."
go get github.com/cratonica/2goarray
if [ $? -ne 0 ]; then
echo Failure executing go get github.com/cratonica/2goarray
exit
fi
fi
if [ -z "$1" ]; then
echo Please specify a PNG file
exit
fi
if [ ! -f "$1" ]; then
echo $1 is not a valid file
exit
fi
OUTPUT=iconunix.go
echo Generating $OUTPUT
echo "//+build linux darwin" > $OUTPUT
echo >> $OUTPUT
cat "$1" | $GOPATH/bin/2goarray Data icon >> $OUTPUT
if [ $? -ne 0 ]; then
echo Failure generating $OUTPUT
exit
fi
echo Finished
可以看到,它安装了一个2goarray
库并且将转换后的数据输出到iconunix.go
中,变量名为Data
,包名为icon
。这里也可以自己修改为不同的名字。
参照systray
中的示例,我们在main.go
中写入如下代码:
package main
import (
"encoding/json"
"ethprice/icon"
"fmt"
"net/http"
"time"
"github.com/getlantern/systray"
)
const URL = "https://api.pro.coinbase.com/products/ETH-USD/ticker"
type EthPrice struct {
Price string `json:price`
}
type Callback func(s string)
var priceInfo = new(EthPrice)
var t *time.Ticker
var step = 15
func backgroundTask(cb Callback) {
t = time.NewTicker(time.Duration(step) * time.Second)
for range t.C {
cb(fetchPrice())
}
}
func fetchPrice() string {
resp, err := http.Get(URL)
if err != nil {
return "-"
}
defer resp.Body.Close()
json.NewDecoder(resp.Body).Decode(priceInfo)
return fmt.Sprintf("ETH $%s(每%d秒)", priceInfo.Price, step)
}
func main() {
systray.Run(onReady, onExit)
}
func onReady() {
go backgroundTask(systray.SetTitle)
systray.SetIcon(icon.Data)
systray.SetTitle(fmt.Sprintf("ETH $%s(每%d秒)", priceInfo.Price, step))
systray.SetTooltip("定时刷新ETH价格")
oneMinite := systray.AddMenuItem("每分钟", "每分钟刷新一次")
halfMinite := systray.AddMenuItem("每半分钟", "每30秒刷新一次")
quartor := systray.AddMenuItem("每15秒", "每15秒刷新一次")
mQuit := systray.AddMenuItem("退出", "退出程序")
systray.SetTitle(fetchPrice())
go func() {
for {
select {
case
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?