curses ウィンドウを正しく更新するにはどうすればいいですか? 質問する

curses ウィンドウを正しく更新するにはどうすればいいですか? 質問する
while 1:
    ...
    window.addstr(0, 0, 'abcd')
    window.refresh()
    ...

windowサイズは端末のフルサイズで、 を保持するのに十分な大きさですabcd'abcd'が のような短い文字列に変更された場合'xyz'、端末には が表示されます'xyzd'。 一体何が間違っているのでしょうか?

ベストアンサー1

次のコードがあり、それをどのように実装するかを知りたいとしますdraw()

def draw(window, string):
    window.addstr(0, 0, string)
    window.refresh()

draw(window, 'abcd')
draw(window, 'xyz')  # oops! prints "xyzd"!

最も単純で「呪いっぽい」解決策は間違いなく

def draw(window, string):
    window.erase()  # erase the old contents of the window
    window.addstr(0, 0, string)
    window.refresh()

代わりに次のように書きたくなるかもしれません:

def draw(window, string):
    window.clear()  # zap the whole screen
    window.addstr(0, 0, string)
    window.refresh()

でもやめてください!フレンドリーな名前にもかかわらず、clear()これは本当に画面全体を無条件に再描画したい場合、つまり、「ちらつき」です。erase()関数はちらつきなしで正しく動作します。

Frédéric Hamidi は、現在のウィンドウの一部だけを消去するための次のソリューションを提案しています。

def draw(window, string):
    window.addstr(0, 0, string)
    window.clrtoeol()  # clear the rest of the line
    window.refresh()

def draw(window, string):
    window.addstr(0, 0, string)
    window.clrtobot()  # clear the rest of the line AND the lines below this line
    window.refresh()

より短く、純粋なPythonの代替案としては、

def draw(window, string):
    window.addstr(0, 0, '%-10s' % string)  # overwrite the old stuff with spaces
    window.refresh()

おすすめ記事