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

问题描述 投票:0回答:5

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

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()
也没有帮助。

python python-3.x stdout
5个回答
6
投票

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

然后,这应该可以工作:

import sys
import time

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

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


4
投票

您正在尝试使用 ANSI 转义序列来移动光标。 Windows 默认情况下不支持这些。要启用它们,您可以在终端中使用

colorama
安装
pip install colorama
模块,然后在 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


2
投票

更新了 python 3.4+ 的答案

由于 print 函数有行结束和行刷新参数,你可以用这种方式。

text = str()
for i in range(10):
    text = "Loading{}".format("." * i)
    print(text, end="\r", flush=True)
print(" " * len(text), end="\r")

我找不到更优雅的解决方案来清洁最后的生产线。如果有人知道请与我分享。


0
投票

否则如果你只想渲染,你可以这样做,

import sys
import time

# point by point
msg = "Loading"

print(msg, end="")

for _ in range(10):
    print(end=".")
    sys.stdout.flush()
    time.sleep(1)
print()

# Or all char by char
i = 10
msg = "Loading" + "." * i

for char in msg:
    print(end=char)
    sys.stdout.flush()
    time.sleep(1)
print()

希望能帮到你。谢谢


0
投票

正确答案是

import sys
import time
for i in range(5):
    sys.stdout.write("\r" + "Loading" + "." * i)
    time.sleep(0.5)
sys.stdout.write("\r")
print("Finish")
© www.soinside.com 2019 - 2024. All rights reserved.