Как правильно обновить окно проклятий? - PullRequest
9 голосов
/ 11 марта 2012
while 1:
    ...
    window.addstr(0, 0, 'abcd')
    window.refresh()
    ...

window размер - полный размер терминала, достаточно большой, чтобы вместить abcd.Если 'abcd' будет изменен на более короткую строку, например 'xyz', то на терминале я увижу 'xyzd'.Что именно я делаю не так?

Ответы [ 3 ]

6 голосов
/ 19 апреля 2017

Предположим, у вас есть этот код, и вы просто хотите знать, как реализовать 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.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() действительно только для , когда вы хотите, чтобы весь экран перерисовывался безоговорочно, , то есть, "мерцание". Функция 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()
5 голосов
/ 11 марта 2012

addstr () печатает только указанную вами строку, но не очищает следующие символы. Вам придется сделать это самостоятельно:

  • Чтобы очистить символы до конца строки, используйте clrtoeol () ,

  • Чтобы очистить символы до конца окна, используйте clrtobot () .

2 голосов
/ 24 февраля 2014

Я использую oScreen.erase().Он очищает окно и возвращает курсор на 0,0

...