はじめに
メッセージをコンソールの同じ行に上書きして出力したい場合に、キャリッジリターンを使うと簡単に出来ます。
しかし、後続するメッセージが前のメッセージより短い場合は、出力が綺麗になりません。
単純に前のメッセージと同じ文字数になるだけ末尾に空白文字足してを出力すると綺麗な見た目にはなります。
ただ、これだと力技なのでConsole Virtual Terminal Sequencesを使った方法のメモです。
サンプル
- test1: 単純な方法。見た目が悪くなる。
- test2: 力技。ただ環境に依存しない。
- test3: Console Virtual Terminal Sequencesを使える場合は、これで綺麗に出来る。環境に依存する。
python
import sys
import time
import random
def getRandomStr(string="abcdefghijklmnopqrstuvwxyz", rMin=1, rMax=10):
return "".join(random.choices(string, k=random.randint(rMin, rMax)))
def test1():
print(f"start: {sys._getframe().f_code.co_name}")
for i in range(11):
print(f"\r{i:2}: {getRandomStr()}#", end="")
time.sleep(0.5)
print(f"\nend: {sys._getframe().f_code.co_name}")
def test2():
print(f"start: {sys._getframe().f_code.co_name}")
oldLen = 0
for i in range(11):
str = getRandomStr() + "#"
l = len(str)
if l < oldLen:
str += " " * (oldLen - l)
oldLen = l
print(f"\r{i:2}: {str}", end="")
time.sleep(0.5)
print(f"\nend: {sys._getframe().f_code.co_name}")
def test3():
print(f"start: {sys._getframe().f_code.co_name}")
for i in range(11):
str = getRandomStr()
print(f"\r\x1b[1M{i:2}: {str}#", end="")
time.sleep(0.5)
print(f"\nend: {sys._getframe().f_code.co_name}")
test1()
test2()
test3()
参考