编写一个windows的闹钟,到了时间点就自动弹出窗口。
示例:每分钟弹一次,显示10秒就关闭。
哈哈哈,这不就是恶心的广告弹框么。
首先准备一个闹钟的图片
fyne bundle clock.jpg >> bundled.go
在布局的时候需要注意一点,在 layout 里面,你无法设置 Resize ,因此需要在 layout.NewGridWrapLayout
里面设置尺寸,然后在外面再套一层 layout。完整代码如下
package main
import (
"image/color"
"log"
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"github.com/robfig/cron/v3"
)
var a fyne.App
func main() {
DemoClock()
}
func DemoClock() {
a = app.New()
cr := cron.New()
if _, err := cr.AddFunc("*/1 * * * *", func() {
CreateWindow()
}); err != nil {
log.Fatal(err)
}
cr.Start()
a.Run()
}
func CreateWindow() {
st := time.Now()
w := a.NewWindow("Clock")
w.Resize(fyne.NewSize(320, 180))
w.CenterOnScreen()
img := canvas.NewImageFromResource(resourceClockJpg)
img.FillMode = canvas.ImageFillOriginal
content1 := container.New(layout.NewCenterLayout(), container.New(layout.NewGridWrapLayout(fyne.NewSize(80, 80)), img))
clock := canvas.NewText("", color.Black)
content2 := container.New(layout.NewCenterLayout(), clock)
clock.Text = time.Now().Format("15:04:05")
clock.TextSize = 20
clock.Refresh()
empty := canvas.NewText("", color.Black)
w.SetContent(container.New(layout.NewVBoxLayout(), content1, empty, content2))
w.Show()
go func() {
for range time.Tick(time.Second) {
clock.Text = time.Now().Format("15:04:05")
clock.Refresh()
if time.Now().Sub(st) >= 10*time.Second {
w.Hide()
break
}
}
}()
}
go build && clock.exe
效果如下
脱离CMD,并压缩。
go build -ldflags="-H windowsgui -w -s"
你也可以将其注册到windows系统服务,伴随系统一起启动。
以管理员身份打开一个CMD
// 注册服务
sc create myclock binpath="D:/dev/php/magook/trunk/server/golang/project/clock"
// 删除服务
sc delete myclock
// 启动服务
sc start myclock
// 停止服务
sc stop myclock