0

0

如何用mpb创建两行进度条?

WBOY

WBOY

发布时间:2024-02-06 08:51:08

|

971人浏览过

|

来源于stackoverflow

转载

如何用mpb创建两行进度条?

问题内容

我正在尝试用 mpb 制作两行进度条。

假设我有一个包含文件绝对路径的切片。

list := []string{"c:\temp\01.png",  "c:\temp\02.png",  "c:\temp\03.png",  "c:\temp\test.png",  "c:\temp\test01.png"}

我希望它像这样显示:

processing 01.png ...
0 / 5 [                    ] 0%
processing 02.png ...
1 / 5 [==                  ] 20%
processing 03.png ...
2 / 5 [====                ] 40%

等等。

将“正在处理...”部分和进度条分开的原因是:

  1. 我想显示有关当前处理状态的附加信息。
    processing 01.png ... [mode: webp]
    0 / 5 [                    ] 0%
  2. 有时,我必须处理同一个文件两次。
    processing 01.mp4 ... [mode: webm] [pass: 1/2]
    0 / 5 [                    ] 0%
    processing 01.mp4 ... [mode: webm] [pass: 2/2]
    0 / 5 [                    ] 0%
    请注意,进度条未更改。
  3. 我也想一次制作多个进度条。
    Processing 01.mp4 ... [Mode: WebM] [Pass: 1/2]
    4 / 5 [================    ] 0%
    Processing 01.png ... [Mode: WebP]
    2 / 5 [========            ] 0%
    Processing DONE [Mode: MP3]
    5 / 5 [====================] 100%
    当事情发生变化时,每个进度条都应该尽快更新,而不是“每 0.5 秒更新每个进度条”。

我找不到这样做的方法。 mpb 的每个示例代码都是在单行中完成其工作。


正确答案


我第一次看到这个库,但在探索了一些代码之后,我发现了如何根据我们的需要添加新的和自定义的栏。我对您在评论中提供的链接示例进行了一些修改,以演示添加和自定义栏。

package main

import (
    "fmt"
    "io"
    "math/rand"
    "time"

    "github.com/vbauerster/mpb/v8"
    "github.com/vbauerster/mpb/v8/decor"
)

func main() {
    p := mpb.new()

    var piece, piece2 int64

    var way, way2 int64

    file := func(_ decor.statistics) string {

        return "file.extension "
    }

    file2 := func(_ decor.statistics) string {

        return "file2.extension "
    }

    part := func(s decor.statistics) string {

        s.current = piece
        s.total = 5
        return fmt.sprintf(" part %d/%d", s.current, s.total)
    }

    part2 := func(s decor.statistics) string {

        s.current = piece2
        s.total = 10
        return fmt.sprintf(" part %d/%d", s.current, s.total)
    }

    pass := func(s decor.statistics) string {

        s.current = way
        s.total = 2
        return fmt.sprintf(" pass %d/%d", s.current, s.total)
    }

    pass2 := func(s decor.statistics) string {

        s.current = way2
        s.total = 4
        return fmt.sprintf(" pass %d/%d", s.current, s.total)
    }
    var total = 100

    bar := p.new(int64(total),
        mpb.nopstyle(), // make main bar style nop, so there are just decorators
        mpb.barextender(extended(mpb.barstyle().build()), false), // extend wtih normal bar on the next line
        mpb.prependdecorators(
            decor.any(file),
            decor.name("percentage: "),
            decor.newpercentage("%d"),
            decor.any(part),
            decor.any(pass),
        ),
    )

    bar2 := p.new(int64(total+100),
        mpb.nopstyle(),
        mpb.barextender(extended(mpb.barstyle().build()), false),

        mpb.prependdecorators(
            decor.any(file2),
            decor.name("percentage: "),
            decor.newpercentage("%d"),
            decor.any(part2),
            decor.any(pass2),
        ),
    )
    // simulating some work
    max := 100 * time.millisecond

    for i := 0; i < total+100; i++ {

        switch {
        case i == 20 || i == 40 || i == 60 ||
            i == 80 || i == 100 || i == 120 ||
            i == 140 || i == 160 || i == 180:
            piece2++

            if i == 100 {
                way2++

                piece = 5
                way = 2
            } else if i < 100 {
                piece++
            }

        case i == 50 || i == 150:

            if i < 100 {
                way++
            }

            way2++
        }

        time.sleep(time.duration(rand.intn(10)+1) * max / 10)

        if i < 100 {
            bar.increment()
        }
        bar2.increment()
    }

    way2 = 4
    piece2 = 10
    // wait for our bar to complete and flush
    p.wait()
}

func extended(base mpb.barfiller) mpb.barfiller {
    return mpb.barfillerfunc(func(w io.writer, st decor.statistics) error {
        err := base.fill(w, st)
        if err != nil {
            return err
        }
        _, err = io.writestring(w, "\n")
        return err
    })
}

假设您已经知道如何制作自定义装饰器。

要创建一个新栏,您可以执行以下操作:

bar := p.new(int64(total),
        mpb.nopstyle(), // make main bar style nop, so there are just decorators
        mpb.barextender(extended(mpb.barstyle().build()), false), // extend wtih normal bar on the next line
        mpb.prependdecorators(
            decor.any(file),
            decor.name("percentage: "),
            decor.newpercentage("%d"),
            decor.any(part),
            decor.any(pass),
        ),
    )

例如,我只制作了两个金条,但您制作了两个以上。

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载

在这个示例中,为了演示如何制作新栏,我使用了 new() 方法,但经过一些研究后,我发现还有更多方法可以制作新栏。区别主要在于酒吧的外观。您可以通过在 文档

p.new() 的第一个参数用于定义条形的总值,在该条形中为 100。

只需将您的装饰器/部分放入 mpb.prependdecoratorsmpb.appenddecorators 即可。

mpb.prependdecorators(
            decor.any(file),
            decor.name("percentage: "),
            decor.newpercentage("%d"),
            decor.any(part),
            decor.any(pass),
        ),

您可以为每个栏使用相同的装饰器,但我建议为每个栏创建新的装饰器以避免发生冲突的可能性。

这将分别显示文件名、百分比、部分和通过:

file.extension percentage: 100% part 5/5 pass 2/2  
[==============================================================================]

在此示例中,每个装饰都会根据其循环中的设置值增加 1,循环遍历条形的总值。在这个栏中,我只是迭代了 1 到 100。我的目标是 100 到 5 个部分。当循环变量遇到100中的5个部分之一时,条形的part装饰会增加1。
而当达到50时,pass装饰就会增加1。

for i := 0; i < total+100; i++ {

        switch {
        case i == 20 || i == 40 || i == 60 ||
            i == 80 || i == 100 || i == 120 ||
            i == 140 || i == 160 || i == 180:
            piece2++

            if i == 100 {
                way2++

                piece = 5
                way = 2
            } else if i < 100 {
                piece++
            }

        case i == 50 || i == 150:

            if i < 100 {
                way++
            }

            way2++
        }

        time.sleep(time.duration(rand.intn(10)+1) * max / 10)

        if i < 100 {
            bar.increment()
        }
        bar2.increment()
    }

这个循环也适用于第二个小节。我只是将两个条形的增量状态组合在一个循环中以使代码更短。如果循环变量小于 100,则增加第一个柱的状态。当它达到100时,将所有装饰全部增加到总数,然后继续增加第二个栏的状态,直到循环结束。循环完成后,完成第二个条形增量的其余部分以达到总计。

65bd2e1fcfff

第二个栏包含 10 个零件和 4 个通道,总价值为 200。

整个代码的输出是:

file.extension percentage: 9% part 0/5 pass 0/2  
[======>-----------------------------------------------------------------------]
file2.extension percentage: 4% part 0/10 pass 0/4  
[===>--------------------------------------------------------------------------]
file.extension percentage: 49% part 2/5 pass 0/2  
[=====================================>----------------------------------------]
file2.extension percentage: 24% part 2/10 pass 0/4  
[==================>-----------------------------------------------------------]
file.extension percentage: 100% part 5/5 pass 2/2  
[==============================================================================]
file2.extension percentage: 74% part 7/10 pass 2/4  
[=========================================================>--------------------]
file.extension Percentage: 100% Part 5/5 Pass 2/2  
[==============================================================================]
file2.extension Percentage: 100% Part 10/10 Pass 4/4  
[==============================================================================]

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

45

2025.09.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

41

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

3

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号