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

window tamaño es el tamaño de terminal completo, lo suficientemente grande como para contener abcd. Si 'abcd' se modifica a una cadena más corta como 'xyz', entonces en la terminal I verá 'xyzd'. ¿Qué estoy haciendo exactamente mal?Cómo actualizar la ventana de curses correctamente?

Respuesta

5

addstr() solo imprime la cadena que especifique, no borra los siguientes caracteres. Va a tener que hacer eso mismo:

  • Para borrar caracteres hasta el final de la línea, utilice clrtoeol(),

  • Para borrar caracteres hasta el final de la ventana, utilice clrtobot().

+0

Tiene que ser hecho antes 'actualizar' o después? – Pablo

+0

Antes de 'refresh()' y después de 'addstr()' (todas estas operaciones solo actualizan la pantalla de maldiciones "virtuales" hasta que se llame a 'refresh()'). –

2

Yo uso oScreen.erase(). Se borra la ventana y pone el cursor hacia atrás en 0,0

2

Supongamos que tiene este código, y lo que desea saber cómo implementar draw():

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

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

El más sencillo y "maldiciones-ish "la solución es, sin duda

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

Usted puede verse tentado a escribir esto en su lugar:

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

¡Pero no lo hagas! A pesar del nombre de apariencia amigable, clear() es realmente solo para when you want the entire screen to get redrawn unconditionally, es decir, "parpadeo". La función erase() hace lo correcto sin parpadeo.

Frédéric Hamidi ofrece las siguientes soluciones para borrar sólo una parte (s) de la ventana actual:

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

Una alternativa más corta y puro en Python sería

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