教程三:go语言windows gui界面开发之walk 控件学习第二节之进度条

一、任务栏进度条

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() {
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘帝阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值