【问题标题】:Python - How to display two counters in for loopsPython - 如何在 for 循环中显示两个计数器
【发布时间】:2015-10-12 10:56:03
【问题描述】:

我正在尝试实现下一个效果:

我有两个计数器,一个应该是“当前”计数器,应该从 1 计数到 123,而控制台底部还应该有一个名为“Total”的计数器,应该显示总计数,例如 234。

这是我的代码:

import sys
import time

n = 0
for _ in range(0, 5):
    i = 1
    for _ in range(0, 123):
        sys.stdout.write("\r    " + "Current: %d" % i)
        sys.stdout.flush()
        i = i + 1
        n = n + 1
        time.sleep(0.01)

    print('')
    sys.stdout.write("\rTotal: %d" % n)
    time.sleep(0.5)

这几乎是我想要的,除了每次执行内部 for 循环时都会覆盖“Total”行。所以应该总是只显示一个“总”行,其中包含循环总数。

这可以在 Python 中实现吗?如何实现?

【问题讨论】:

  • 这听起来你正在构建一个比简单 io 更复杂的控制台 GUI。你见过docs.python.org/3/library/curses.html吗?
  • 将所有内容放在一行中会容易得多...
  • @Joost 不,但我会检查一下。
  • @swenzel 这不是我想要的
  • @RhymeGuy 明白了。我只是想指出,有时替代方案虽然吸引力不大,但如果它可以为您节省大量时间和头痛,可能值得考虑;)

标签: python python-3.x for-loop counter


【解决方案1】:

如果你真的想要两行,你可以利用CPL (Cursor Previous Line) ANSI escape code 将光标移动到上一行的开头。

import sys
import time
import colorama

print('')
total = 0
for _ in range(0, 5):
    current = 1
    sys.stdout.write("\033[F")
    for _ in range(0, 123):
        sys.stdout.write("\rCurrent: %03d" % current)
        sys.stdout.flush()
        current += 1
        total += 1
        time.sleep(0.01)

    sys.stdout.write("\nTotal: %d" % total)
    sys.stdout.flush()
    time.sleep(0.5)

请注意,在 Windows 上,您必须先导入 colorama module

【讨论】:

  • 这和我的例子一样,这不是我想要的:)
  • @RhymeGuy 你是说Total 行被覆盖了吗?对我来说很好。你在使用colorama 模块吗?
  • 是的,我正在使用 colorama 模块。 Total is line 被覆盖。
  • @RhymeGuy 你用的是什么操作系统/终端?
  • 带有 PyCharm 控制台的 Windows 7
【解决方案2】:

控制台写入只发生在一行中,因此它将清除“总数”。

一种方法是始终在下一行打印“总计”和“当前”。

for _ in range(0, 123):
    i = i + 1
    sys.stdout.write("\r    " + "Current: %d" % i)
    n = n + 1
    sys.stdout.write("\rTotal: %d" % n)

    sys.stdout.flush()

或者,有一个单独的渲染循环(在另一个线程上)连续打印这些全局变量(当前和总计)。它将有自己的刷新率。

【讨论】:

  • 这不是我想要达到的目标。
【解决方案3】:

按照@Joost 的建议玩了诅咒后解决了

最终代码:

import time
import curses

stdscr = curses.initscr()

n = 0
b = 0
for _ in range(0, 5):
    i = 1
    for _ in range(0, 123):
        stdscr.addstr(b, 0, "Current: %d" % i)
        i = i + 1
        n = n + 1
        time.sleep(0.01)
        stdscr.addstr(b+1, 0, "Total: %d" % n)
        stdscr.refresh()
    b = b + 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 2012-05-30
    • 2020-05-27
    • 2023-03-30
    • 1970-01-01
    • 2010-11-14
    • 2011-03-10
    相关资源
    最近更新 更多