两个单独更新的进度条

Two progress bars with separate updates

我想要一个应用程序的加载栏,但是说应用程序有很长的暂停时间,所以我还想要一个指示器,即使加载栏有一段时间没有填充,进程也没有停止。

使用 python 进度条库,我想到了这个。

import progressbar
import time

loopval=20

bar = progressbar.ProgressBar(maxval=loopval,widgets[progressbar.Bar(marker='#',fill='.',\
left='[',right=']'),progressbar.AnimatedMarker(), progressbar.Percentage()])

bar.start()

for i in range(loopval):
   bar.update(i+1)
   time.sleep(0.1)

这会打印出一个漂亮的“.”栏's that slowly fills with '#',并且在行尾有一个准确的百分比以及一个旋转的动画标记。

例如: [############################################### ###########################]/100% (末尾的斜杠在 |、/、- 和 \ 之间)

我希望能够独立于栏更新来更新动画标记。这样即使条形图有一段时间没有更新,动画标记也会显示进程仍然存在。

我查看了进度条文档,但找不到执行此操作的方法。如果有更好的库可以让这更容易,我不会嫁给这个库,我也很乐意切换。

不确定这是否正是您要查找的内容,但我通过使用 asyncio 包装您的代码设法做到了这一点。我将更新之间的睡眠时间增加到 1 秒,以使异步更新更加明显。希望这有帮助。

# Python 3.6+
import asyncio
import progressbar

async def update_bar(bar):
    while not bar.end_time:
        bar.update()
        await asyncio.sleep(0.1)

async def iterate_bar(bar, loopval):
    bar.start()
    for i in range(loopval):
        bar.update(i+1)
        await asyncio.sleep(1)
    bar.finish()

async def main(bar, loopval):
    await asyncio.gather(update_bar(bar), iterate_bar(bar, loopval))

if __name__ == '__main__':
    loopval = 20
    bar = progressbar.ProgressBar(
        maxval=loopval,
        widgets=[
            progressbar.Bar(
                marker='#',
                fill='.',
                left='[',
                right=']',
            ),
            progressbar.AnimatedMarker(),
            progressbar.Percentage(),
        ],
    )

    asyncio.run(main(bar, loopval))