
我正在尝试用 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%
等等。
将“正在处理...”部分和进度条分开的原因是:
processing 01.png ... [mode: webp] 0 / 5 [ ] 0%
processing 01.mp4 ... [mode: webm] [pass: 1/2] 0 / 5 [ ] 0%
processing 01.mp4 ... [mode: webm] [pass: 2/2] 0 / 5 [ ] 0%
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%
我找不到这样做的方法。 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),
),
)例如,我只制作了两个金条,但您制作了两个以上。
在这个示例中,为了演示如何制作新栏,我使用了 new() 方法,但经过一些研究后,我发现还有更多方法可以制作新栏。区别主要在于酒吧的外观。您可以通过在 文档。
p.new() 的第一个参数用于定义条形的总值,在该条形中为 100。
只需将您的装饰器/部分放入 mpb.prependdecorators 或 mpb.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 [==============================================================================]
以上就是如何用mpb创建两行进度条?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号