while 1:
...
window.addstr(0, 0, 'abcd')
window.refresh()
...
window
size is full terminal size, big enough to hold abcd
.
If 'abcd'
is modified to shorter string like 'xyz'
, then on terminal I will see 'xyzd'
. What exactly I am doing wrong?
The routine wrefresh copies the named window to the physical terminal screen, taking into account what is already there to do optimizations. The refresh routine is the same, using stdscr as the default window.
To clear characters until the end of the line, use clrtoeol(), To clear characters until the end of the window, use clrtobot().
Let's suppose you have this code, and you just want to know how to implement draw()
:
def draw(window, string):
window.addstr(0, 0, string)
window.refresh()
draw(window, 'abcd')
draw(window, 'xyz') # oops! prints "xyzd"!
The most straightforward and "curses-ish" solution is definitely
def draw(window, string):
window.erase() # erase the old contents of the window
window.addstr(0, 0, string)
window.refresh()
You might be tempted to write this instead:
def draw(window, string):
window.clear() # zap the whole screen
window.addstr(0, 0, string)
window.refresh()
But don't! Despite the friendly-looking name, clear()
is really only for when you want the entire screen to get redrawn unconditionally, i.e., "flicker". The erase()
function does the right thing without flicker.
Frédéric Hamidi offers the following solutions for erasing just part(s) of the current window:
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()
A shorter and pure-Python alternative would be
def draw(window, string):
window.addstr(0, 0, '%-10s' % string) # overwrite the old stuff with spaces
window.refresh()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With