一、任务栏进度条
1.1 实现思路
1.1.1 START(启动)按钮:启动进度条间隔100毫秒进度+1;
- 第一步:新建Dialog窗口, 即创建*walk.Dialog类型变量dlg ;
- 第二步:新建START按钮,即*walk.PushButton类型变量startBtn;
- 第三步:dlg.ProgressIndicator().SetTotal(100)设置进度条总长;
- 第四部:dlg.ProgressIndicator().SetCompleted(i)更新进度条当前进度,i就是更新后的值;
- 第五步:第三步、第四部写在第二步创建的按钮点击事件中即可。
1.1.2 Paused(暂停)按钮:暂停进度条,并且进度条显示黄色;
- 第一步:新建var stopChan chan struct{}通道,长度为1;
- 第二步:Paused按钮事件时,向通道stopChan 写入数据stopChan <-struct{}{};
- 第三步:此时START按钮拉起的进度条协程中向stopChan 写数据会阻塞,即实现暂停进度条;
1.1.3 Normal(恢复)按钮:恢复进度条进度,并且进度条恢复绿色
- Normal按钮事件时,从通道stopChan中读取一次数据即可;
1.1.4 Error(出错)按钮:进度出错时使用,进度暂停,并且进度显示变红,
- Error按钮事件时,向通道stopChan 写入数据stopChan <-struct{}{};
1.1.5 NoProgress(无进度状态)按钮:取消进度
- 通知进度条进度接口退出,同时清除进度;
- 实现:此处直接关闭通道stopChan ,在START任务重recover掉,比较暴力;
1.1.6 Indeterminate(不确定状态)按钮:取消进度
- 该状态根据自己实际业务实现,此处略去;
1.2 效果图如下:
1.3代码如下
// main.go文件
package main
import (
. "log"
"os"
"runtime/debug"
"time"
"github.com/lxn/walk"
)
var log *Logger
var stopChan chan struct{
}
func init() {
log = CreateLogService()
stopChan = make(chan struct{
}, 1)
}
// 创建日志服务
func CreateLogService() *Logger {
file := "log.txt"
logFile, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm) // 以读写方式打开文件,如果没有该名称文件则自动创建,以追加的方式写入文件
if err != nil {
return nil
}
logger := New(logFile, "[logInfo:]", LstdFlags|Lshortfile) // 将文件设置为loger作为输出
return logger
}
func main() {
defer func() {
err := recover()
if err != nil {
log.Printf("err:%s", err)
log.Printf("stack:%s.", debug.Stack())
}
}()
if _, err := RunMyDialog(nil); err != nil {
log.Fatal(err)
}
}
type MyDialog struct {
*walk.Dialog
ui myDialogUI
}
func (dlg *MyDialog) setState(state walk.PIState) {
if err := dlg.ProgressIndicator().SetState(state); err != nil {
log.Print(err)
}
}
func RunMyDialog(owner walk.Form) (int, error) {
dlg := new(MyDialog)
if err := dlg.init(owner); err != nil {
return 0, err
}
dlg.SetLayout(walk.NewHBoxLayout())
dlg.ui.indeterminateBtn.Clicked().Attach(func() {
log.Println("SetState indeterminate")
dlg.setState(walk.PIIndeterminate)
})
dlg.ui.noProgressBtn.Clicked().Attach(func() {
log.Println("SetState noprogress")
close(stopChan)
dlg.setState(walk.PINoProgress)
})
dlg.ui.normalBtn.Clicked().Attach(func()