2012-03-11 8 views
7
while 1: 
    ... 
    window.addstr(0, 0, 'abcd') 
    window.refresh() 
    ... 

windowサイズはフルサイズです。abcdを保持するのに十分な大きさです。 'abcd''xyz'のように短い文字列に変更した場合、端末では'xyzd'と表示されます。私は間違って何をしているのですか?cursesウィンドウを正しく更新するには?

答えて

5

addstr()は指定した文字列だけを出力しますが、次の文字はクリアされません。

  • clrtoeol()を使用し、行の最後までの文字をクリアするには、

  • clrtobot()を使用し、ウィンドウの最後までの文字を消去するには:あなたは自分でそれを行う必要があります。

+0

だろうそれは前に行う必要があります'リフレッシュ'? – Pablo

+0

'refresh()'の前と 'addstr()'の後(これらの操作はすべて 'refresh()'が呼び出されるまで「バーチャル」cu​​rses画面を更新するだけです)。 –

2

私はoScreen.erase()を使用します。これは、ウィンドウをクリアし、0,0

2

に戻って、カーソルを置くのは、あなたがこのコードを持って、そしてあなただけの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() 
関連する問題