_curses.error: addwstr() возвратил ERR при изменении nlines на 1 в методе newwin

Код является:

from curses import *
from curses.panel import *

def main(stdscr):
    start_color()
    curs_set(0)
    init_pair(1, COLOR_BLACK, COLOR_CYAN)

    posy = posx = 0
    window = newwin(1, 1, posy, posx)
    panel = new_panel(window)
    window.addstr('*', color_pair(1))
    update_panels()
    doupdate()

    while True:
        key = stdscr.getch()

        if key == ord('j'):
            posy+=1
        elif key == ord('k'):
            posy-=1
        elif key == ord('h'):
            posx-=1
        elif key == ord('l'):
            posx+=1
        elif key == ord('q'):
            endwin()
            break
        panel.move(posy,posx)
        update_panels()
        doupdate()
if __name__ == '__main__':
    wrapper(main)

Я получаю эту ошибку:

Traceback (most recent call last):
  File "test_1_height_error.py", line 34, in <module>
    wrapper(main)
  File "/usr/lib/python3.7/curses/__init__.py", line 94, in wrapper
    return func(stdscr, *args, **kwds)
  File "test_1_height_error.py", line 12, in main
    window.addstr('*', color_pair(1))
_curses.error: addwstr() returned ERR

Однако, если я изменяю строку 10 с window = newwin(1, 1, posy, posx) на window = newwin(2, 1, posy, posx), т.е. изменяю аргументы nlines больше 1, тогда это работает нормально.

Я действительно не понимаю, почему я получаю эту проблему.

1 ответ

Решение

addch и все, что построено из него (например, addstr) печатает текст и перемещает курсор за пределы того, что было напечатано.

Окно 1x1 недостаточно велико, чтобы написать один символ и перенести на следующую строку (так как вы заполнили строку). Когда окно было 2х1, оно могло это сделать.

ncurses (любые X/Open Curses) имеет другие функции (такие как addchstr), которые не перемещают курсор, но я не вижу тех, которые упомянуты в ссылке на python curses.

Так как ncurses напечатает нужный вам символ, и это единичный случай, обходной путь - заключить addstr в оператор try, например,

try:
    window.addstr('*', color_pair(1))
except curses.error:
    pass
Другие вопросы по тегам