覆盖/清除先前的控制台行

新手上路,请多包涵

我的问题是,我希望能够覆盖/清除 python 控制台中以前打印的行。这个问题已经被问过很多次了(例如 Python - Remove and Replace Printed items ),但是使用的是完全相同的代码(答案被标记为正确,对我来说什么也没有打印出来):

 for i in range(10):
    print("Loading" + "." * i)
    time.sleep(1)
    sys.stdout.write("\033[F") # Cursor up one line
    sys.stdout.write("\033[K") # Clear to the end of line

我得到输出(在 python IDLE 中):

 Loading
[F[KLoading.
[F[KLoading..
[F[KLoading...
[F[KLoading....
[F[KLoading.....
[F[KLoading......
[F[KLoading.......
[F[KLoading........
[F[KLoading.........
[F[KLoading..........
[F[K

有任何想法吗?我在谷歌上搜索了很多,没有任何效果。它要么不打印任何内容,要么只是不覆盖。

如果有帮助,我正在运行 Windows 8.1 和 Python 3.51。通过 cmd 运行代码不会影响任何东西。

此外,添加 sys.stdout.flush() 也无济于事。

原文由 czyngis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

您需要从命令行运行您的程序,而不是从 IDLE 中运行。

然后,这应该有效:

 import sys
import time

for i in range(10):
    sys.stdout.write("\r" + "Loading" + "." * i)
    time.sleep(1)
    sys.stdout.flush()
print()

\r 转到行首。所以你必须确保你打印的字符串至少和之前的字符串一样长。否则,您将看到以前打印的部分内容。

原文由 Mike Müller 发布,翻译遵循 CC BY-SA 4.0 许可协议

您正在尝试使用 ANSI 转义序列来移动光标。 Windows 默认不支持这些。要启用它们,您可以在终端中安装带有 pip install coloramacolorama 模块,然后在 Python 中:

 import colorama
colorama.init()

如果您已升级到 Windows 10,则可以改为启用支持:

 import ctypes
kernel32 = ctypes.windll.kernel32
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)

(来源: https ://stackoverflow.com/a/36760881/6379747)

原文由 ForgottenUmbrella 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题