How to refresh curses window correctly?

前端 未结 3 2267
遇见更好的自我
遇见更好的自我 2021-02-14 00:00
while 1:
    ...
    window.addstr(0, 0, \'abcd\')
    window.refresh()
    ...

window size is full terminal size, big enough to hold

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-02-14 00:22

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

提交回复
热议问题