while 1:
...
window.addstr(0, 0, 'abcd')
window.refresh()
...
window
サイズはフルサイズです。abcd
を保持するのに十分な大きさです。 'abcd'
を'xyz'
のように短い文字列に変更した場合、端末では'xyzd'
と表示されます。私は間違って何をしているのですか?cursesウィンドウを正しく更新するには?
while 1:
...
window.addstr(0, 0, 'abcd')
window.refresh()
...
window
サイズはフルサイズです。abcd
を保持するのに十分な大きさです。 'abcd'
を'xyz'
のように短い文字列に変更した場合、端末では'xyzd'
と表示されます。私は間違って何をしているのですか?cursesウィンドウを正しく更新するには?
addstr()は指定した文字列だけを出力しますが、次の文字はクリアされません。
clrtoeol()を使用し、行の最後までの文字をクリアするには、
clrtobot()を使用し、ウィンドウの最後までの文字を消去するには:あなたは自分でそれを行う必要があります。
私はoScreen.erase()
を使用します。これは、ウィンドウをクリアし、0,0
に戻って、カーソルを置くのは、あなたがこのコードを持って、そしてあなただけの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.clear() # zap the whole screen
window.addstr(0, 0, string)
window.refresh()
:「解決策は、あなたが代わりにこれを書くために誘惑されるかもしれない間違い
def draw(window, string):
window.erase() # erase the old contents of the window
window.addstr(0, 0, string)
window.refresh()
です210
しかし、しないでください!フレンドリーな見た目の名前にもかかわらず、clear()
は実際にはwhen you want the entire screen to get redrawn unconditionally,のためだけです。つまり、「フリッカー」です。 erase()
機能は、ちらつきなしで適切なことを行います。
フレデリック・ハミディは、現在のウィンドウの一部だけ(複数可)を消去するため、以下のソリューションを提供しています。
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()
だろうそれは前に行う必要があります'リフレッシュ'? – Pablo
'refresh()'の前と 'addstr()'の後(これらの操作はすべて 'refresh()'が呼び出されるまで「バーチャル」curses画面を更新するだけです)。 –