_curses.error: addwstr () возвратил ERR при изменении nlines на 1 в методе newwin - PullRequest
0 голосов
/ 28 января 2019

Код:

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)to window = newwin (2, 1, posy, posx), т. е. измените аргументы nlines более чем на 1, тогда все будет работать нормально.

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

1 Ответ

0 голосов
/ 29 января 2019

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

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

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

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

try:
    window.addstr('*', color_pair(1))
except curses.error:
    pass
...