【问题标题】:How can I modify the STDOUT?如何修改 STDOUT?
【发布时间】:2012-01-24 04:07:28
【问题描述】:

我目前正在编写一个非常简单的终端工具,我想实现以下行为。

终端应该显示:

Downloading "Something" ...

完成下载后,我想将该行替换为:

Downloading "Something" [Done]

我已经看到这样做了 o 创建以下动画:

[-]
[\]
[|]
[/]

由于我对终端工具没有太多经验,我不知道如何实现这种简单的行为。任何帮助将不胜感激。

【问题讨论】:

  • clear;echo "|"; sleep 1; clear;echo "/";sleep 1;clear;echo "-";sleep 1;clear;echo "\\";sleep 1;clear;clear;echo "|"; sleep 1; clear;echo "/";sleep 1;clear;echo "-";sleep 1;clear;echo "\\";sleep 1;clear;clear;echo "|"; sleep 1; clear;echo "/";sleep 1;clear;echo "-";sleep 1;clear;echo "\\";sleep 1;clear;clear;echo "|"; sleep 1; clear;echo "/";sleep 1;clear;echo "-";sleep 1;clear;echo "\\";sleep 1;clear;clear;echo "|"; sleep 1; clear;echo "/";sleep 1;clear;echo "-";sleep 1;clear;echo "\\";sleep 1;clear
  • 只是为了好玩……不要当真。 :)

标签: python c bash terminal stdout


【解决方案1】:

使用退格字符 -- \b

别忘了刷新输出流,它很可能被缓冲了。

【讨论】:

    【解决方案2】:

    以“\r”结束该行的中间版本。任何后续写入都将覆盖该行(只要新写入至少与原始写入一样长)。

    不久前有a similar question;参见my answer there C++ 中的示例代码。

    【讨论】:

      【解决方案3】:

      如果是 ANSI 终端,您可以使用 ANSI Escape Sequences 将光标移回一行或任何其他位置。然后,您可以从光标移动到的位置开始编辑。

      【讨论】:

        【解决方案4】:

        试试这个:

        void test() {
            const char *msg = "Downloading %s%s";
            printf(msg, "file", "...\r");
            printf(msg, "file", "[Done]\n");
        }
        

        魔术是使用 "\r" (CR) :P 实现的。

        【讨论】:

          【解决方案5】:

          虽然使用'\b' 擦除python 中的前一个值确实不难(查看this question 的答案)。我推荐你使用python-progressbar:

          from progressbar import ProgressBar, RotatingMarker
          import time
          
          widgets = ['Downloading something... [', RotatingMarker(), ']']
          
          maxval = 10
          progressbar = ProgressBar(widgets=widgets, maxval=maxval).start()
          for i in range(maxval):
              progressbar.update(i)
              # Do something                               
              time.sleep(0.2)
          widgets[-2] = 'Done'
          progressbar.finish()
          

          原因不仅在于它可以轻松地做您想要的事情,而且您还可以添加其他小部件(ETA、FileTransferSpeed、Percentage,...),如果您希望稍后使进度条看起来更好的取决于您的需求。

          【讨论】:

            猜你喜欢
            • 2014-06-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-26
            • 2016-08-05
            • 2017-07-19
            • 2014-10-20
            • 2016-11-20
            相关资源
            最近更新 更多