4

在声明一个 10 x 10 pad 后,我显然无法无误地写入右下角 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

为什么我不能写到右下角的单元格?

4

1 回答 1

8

问题是添加的字符会导致尝试滚动键盘,并且滚动被禁用。该字符已成功添加(至少在我系统的 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)

Run aspython cursesx.py并出现优势;运行为python cursesx.py foo并出现ftoolong消息;run aspython cursesx.py waytoolongtofitw, CAUGHT, 和toolong消息都会出现。

于 2013-05-26T22:03:02.593 回答