
[code]

    ##
    ##
    
[/code]

こういった模様を

[code]

    ######
    ######
    
[/code]

このように繰り返し横並びに出力したいのですが

[code]

    for _ in range(3):
        print("##\n##")
    
[/code]

では再び一行目に出力されません。  
どうすればよいでしょうか？  
また、このような出力を変数に格納する処理も教えていただけると幸いです。


CC BY-SA 4.0
2019-12-24T03:14:14.680
61728
2019-12-25T12:07:42.090
2019-12-24T03:27:18.100
19110
37184
question
python python3
python3で再び一行目に描画


最近やり取りしたこの記事と同じ内容ですね。  
[Powershellで再描画時に画面のちらつきを抑える方法](https://ja.stackoverflow.com/q/61677/26370)  
ANSI VT100 エスケープシーケンスを使うことで画面上のカーソル移動とか色付けも行うことが出来ます。

Pythonでは[curses](https://docs.python.org/ja/3/howto/curses.html)が使えるでしょう。  
ただしWindows用は無いので代わりにUniCursesというのが使えますと書いてあります。

> Windows 版 Python には curses が含まれていません。
> [UniCurses](https://pypi.org/project/UniCurses) という名の移植版が利用可能です。Fredrik
> Lundh の手による the Console module も試してみると良いでしょう。これには curses と同じ API
> を用いていませんが、カーソル位置指定でのテキスト出力と、マウス、キーボード入力のフルサポートを提供しています。

* * *

**追記**  
その後調べたら UniCurses は 32ビット環境しかサポートしてなさそうなのが判明。  
代替で[windows-curses](https://pypi.org/project/windows-
curses/)というのがありましたが、今回の質問では関係無いけれど全角文字の使い方が難しかったのでちょっと保留。  
元の英語の紹介記事に載っていたモード設定処理を見つけたのでそちらを入れてみました。

[code]

    import platform
    import time
    
    # Windows10 1607以後のコマンドプロンプトでのモード設定(それ以前は未サポート?)
    # PowerShellならば不要だが、あっても実行できる
    if platform.system() == 'Windows':
        from ctypes import windll, wintypes, byref
        STD_OUTPUT_HANDLE = -11
        ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
        hOut = windll.kernel32.GetStdHandle(wintypes.HANDLE(STD_OUTPUT_HANDLE))
        dwMode = wintypes.DWORD()
        result = windll.kernel32.GetConsoleMode(hOut, byref(dwMode))
        dwMode.value |= ENABLE_VIRTUAL_TERMINAL_PROCESSING
        result = windll.kernel32.SetConsoleMode(hOut, dwMode)
    
    loopcount = 3                                      # ループ回数
    lines = 2                                          # 表示行数
    cursorback = '\r' + '\x1B[' + str(lines - 1) + 'A' # カーソルを戻すための文字列
    for i in range(loopcount):
        line = '##' * (i + 1)      # ここから
        outstr = line
        for _ in range(lines - 1):
            outstr += '\n' + line  # ここまで, 出力文字列を作成して変数に入れる処理
    
        print(outstr, end='')      # 文字列表示
        time.sleep(1)              # 表示確認のための1秒待ち
        if i >= (loopcount - 1):   # 最後はカーソルを戻さずに終了
            print('\n')
            break
    
        print(cursorback, end='')  # 次のループのためにカーソルを戻す処理
    
[/code]

参考：  
[Pythonでコンソールに上書きして出力する方法](http://blog.livedoor.jp/pirosoft/archives/8735780.html)  
[Pythonが実行されている環境のOSやバージョン情報などを取得](https://note.nkmk.me/python-platform-
system-release-version/)

curses関連  
[Fails to import pdcurses on windows 64 bit
#2](https://github.com/Chiel92/unicurses/issues/2)  
[n十年ぶりにcurses使ったらやっぱいいじゃんっていう話](https://qiita.com/floatnflow/items/1710b0bdd529e4e3a28a)  
[Pythonで、cursesモジュールを使う](https://torina.top/detail/437/)  
[Python、cursesでシンプルなエディタを作る](https://torina.top/detail/439/)


CC BY-SA 4.0
2019-12-24T03:55:59.003
61730
2019-12-25T12:07:42.090
2019-12-25T12:07:42.090
26370
26370
61728
answer


ANSIの `CUU` (Cursor UP) を出力してください。

[code]

    import sys
    import time
    
    for i in range(3):
        bar = "##" * (i + 1)
    
        sys.stdout.write(f"{bar}\n")
        sys.stdout.write(f"{bar}\r")
        sys.stdout.write("\033[1A\r")
    
        time.sleep(1)
    
    sys.stdout.write("\n\n")
    
[/code]


CC BY-SA 4.0
2019-12-24T12:57:28.810
61739
2019-12-24T12:57:28.810
62
61728
answer