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()