0
#!/usr/bin/env python

import time
import sys
import os
for i in range(10):
    progress_bar = \
        """
        <!DOCTYPE html>
        <html>
        <body>
        <p>Display a gauge:</p>
        <meter value="%s" min="0" max="10">2 out of 10</meter><br>
        </body>
        </html>
        """%(i)

    print  progress_bar
    sys.stdout.flush() # do this after the print
    time.sleep(1.0)

在这里,我试图创建一个进度条,其中“i”是进度指示器。在此处输入图像描述. 屏幕截图如下。我所期望的是,通过使用 sys.stdout.flush() 可以消除以前的 HTML 打印,只保留“i”的当前进度,但它不起作用。任何想法如何达到我的目标?

4

1 回答 1

5

您的 Python 脚本正在生成一个最终由浏览器读取的 HTML 文件。如果您在浏览器中单击“查看源代码”,您应该会看到与在控制台中运行 Python 脚本时看到的相同的内容。

这应该清楚为什么一个打印语句不会“覆盖”另一个。就浏览器而言,它正在读取静态内容,就像您只是将 HTML 文件放在 Web 服务器上一样。唯一的区别是,使用 Python,您可以随意生成 HTML 文件。

要使进度条在浏览器中显示为动态,您需要使用客户端脚本 (Javascript)。

如果您要指示进度的进程是服务器端 (Python),则基本方法可能如下所示:

  • 制作一个 Python 脚本,提供一些信息(以 JSON、纯文本或任何其他对您方便的形式)来指示操作的进度,例如:一个 JSON 文档,如{"finished": false, "progress": 54.9, "target": 100.0}
  • 制作一个 Javascript 函数,根据数字设置进度条的视觉状态。
  • 创建一个 Javascript 函数,该函数对 Python 端进度服务脚本的 URL 执行请求并解析返回的信息。
  • 将这些部分连接在一起。在操作正在进行时,定期轮询服务器以获取其进度并相应地设置进度条。

如果您确实知道(或可以猜测,完全不担心反映现实的指标)该操作将花费固定的时间,您可以通过简单地使 Javascript 进度指示器依赖于时间来跳过很多此操作的关于正在进行的操作的实际状态。

于 2013-09-09T13:16:08.293 回答