コンソールに出力するプログラムを作成していて、コンソールを上書きしたかったのですが、複数行の上書きをする方法で手間取ったのでメモします。
## 環境
* python3
## やりたい事
普通にコンソールに出力すると、以下の様に追記されていってしまいます。
(例は電車のタイムテーブルをシュミレートするプログラム)
(コード例: sys.stdout.write("---")
```
`gutter:false;
10:08:40
A----B----C----D----E----F----G----H----I----J----K----L----M----N
*
10:08:50
A----B----C----D----E----F----G----H----I----J----K----L----M----N
*
# 追記されていってしまう😱
```
ゴールは以下の表示が常に更新されていく事です。
(毎回下に追記されないようにする)
```
`gutter:false;
10:08:50
A----B----C----D----E----F----G----H----I----J----K----L----M----N
*
# 追記されない😄
```
1行の更新は結構あるのですが、複数行の場合は少し調べないと方法が出てきませんでした。
## 方法
ANSIのエスケープコードを使って、カーソル位置を移動してから書き込みを行う事で対応可能でした。
コードはpythonですが、他の言語でも仕組みは同じだと思います。
```python
`gutter:false;
sys.stdout.write("\033[4F")
some_write_code()
# 4行書く処理
sys.stdout.flush()
```
sys.stdout.write("\033\[4F") が肝で、4行上の先頭位置にカーソルを移動しています。
(4が何行上に移動するか、Fが上の先頭に移動の意味です)
書き込む前に毎回カーソルの位置を移動(初期化)する事で追記ではなく、上書きになります。
書き込む量が毎回同じならこれで良いですが、描画領域が変わる場合は前の文字を消すなどの処理が必要になってくると思います。
## 参考URL
* [ANSIエスケープコード](https://www.mm2d.net/main/prog/c/console-02.html)
0 件のコメント :
コメントを投稿