如何正确刷新curses窗口?

时间:2012-03-11 09:04:03

标签: python refresh ncurses curses

while 1:
    ...
    window.addstr(0, 0, 'abcd')
    window.refresh()
    ...

window尺寸为完整的终端尺寸,足以容纳abcd。 如果将'abcd'修改为较短的字符串'xyz',则在终端上我会看到'xyzd'。究竟我做错了什么?

3 个答案:

答案 0 :(得分:5)

addstr()仅打印您指定的字符串,不会清除以下字符。你必须自己做:

  • 要清除字符直到行尾,请使用clrtoeol()

  • 要清除字符直到窗口结束,请使用clrtobot()

答案 1 :(得分:3)

假设您有这段代码,而您只想知道如何实施draw()

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

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

最直截了当的“curses-ish”解决方案绝对是

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

你可能会想要写这个:

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

但不要!尽管看起来很友好,clear()实际上只适用于when you want the entire screen to get redrawn unconditionally,,即“闪烁”。 erase()函数在没有闪烁的情况下做正确的事。

FrédéricHamidi提供以下解决方案,用于删除当前窗口的一部分:

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

答案 2 :(得分:2)

我使用oScreen.erase()。它清除窗口并将光标放回0,0