2013-05-26 3 views
3

После объявления 10-футового пэда я, по-видимому, не могу записать в правый нижний угол 9, 9 без ошибок. Что здесь происходит?ncurses 10,10 pad вызывает ошибку, когда addstr to 9, 9

import curses 

def start(stdscr): 
    curses.curs_set(0) 
    movement = curses.newpad(10, 10) 

    movement.addstr(8, 9, '+') 
    movement.addstr(9, 8, '+') 
    movement.addstr(9, 9, '+') #This line causes an error 

if __name__ == '__main__': 
    curses.wrapper(start) 

причины:

File "curses_movement_testing.py", line 35, in <module> 
    curses.wrapper(start) 
    File "/usr/lib64/python2.6/curses/wrapper.py", line 43, in wrapper 
    return func(stdscr, *args, **kwds) 
    File "curses_movement_testing.py", line 10, in start 
    movement.addstr(9, 9, '+') 
_curses.error: addstr() returned ERR 

почему я не могу писать в нижнем правом углу ячейки?

ответ

6

Проблема заключается в том, что добавленный символ приводит к попытке прокрутки пэда, а прокрутка отключена. Персонаж успешно добавлен (по крайней мере, на реализацию Ncurses моей системы): если вы ловите ошибку и обновления экрана, вы должны увидеть это:

import curses, time 

def start(stdscr): 
    curses.start_color() 
    try: 
     curses.curs_set(0) 
    except curses.error: 
     pass 
    movement = curses.newpad(10, 10) 

    movement.addstr(8, 9, '+') 
    movement.addstr(9, 8, '+') 
    try: 
     movement.addstr(9, 9, '+') 
    except curses.error: 
     movement.addstr(0, 0, 'CAUGHT') 
    movement.refresh(0, 0, 0, 0, 9, 9) 
    curses.doupdate() 
    time.sleep(1) 

if __name__ == '__main__': 
    curses.wrapper(start) 

Если вы звоните movement.scrollok(True) перед записью в правом нижнем углу, там не будет ошибки, но окно прокрутит: возможно, не то, что вы хотите.

Поскольку пэд может быть больше фактического экрана, одним простым решением является добавление дополнительной строки под частью, которую вы будете refresh. Вы можете проверить, записаны ли вы в ту часть, которая не будет отображаться. Вот последний пример:

import curses, sys, time 

def start(stdscr): 
    curses.start_color() 
    try: 
     curses.curs_set(0) 
    except curses.error: 
     pass 
    movement = curses.newpad(11, 10) 

    movement.addstr(8, 9, '+') 
    movement.addstr(9, 8, '+') 
    text = sys.argv[1] if len(sys.argv) > 1 else '+' 
    try: 
     movement.addstr(9, 9, text) 
     y, x = movement.getyx() 
    except curses.error: 
     y, x = movement.getyx() 
     movement.addstr(0, 0, 'CAUGHT') 
    if y >= 10 and x > 0: 
     movement.addstr(1, 0, 'toolong') 
    movement.refresh(0, 0, 0, 0, 9, 9) 
    curses.doupdate() 
    time.sleep(1) 

if __name__ == '__main__': 
    curses.wrapper(start) 

Запуск от имени python cursesx.py и появляются плюсы; введите python cursesx.py foo и появятся сообщения f и toolong; как python cursesx.py waytoolongtofit, и w, CAUGHT и toolong все сообщения появляются.

Смежные вопросы