看下面这个程序:

#!/usr/bin/python2

import curses
import time

stdscr = curses.initscr()
h, w = stdscr.getmaxyx()

stdscr.addch(h-1, w-1, '*')

stdscr.refresh()
time.sleep(3)
curses.endwin()

运行,发现崩溃了,错误提示为

_curses.error: addch() returned ERR

咦,为什么不能在右下角的位置放一个字符?

答案是,addch会将光标向右移动一格,在右下角的位置向右一格就超出窗口了。所以,这个问题不只是stdscr会有,其他window也会有。不只是addch会 有,addstr也会有。

一个解决办法是用insch替代addch。可是这太恶心了,因为insch在其他位置使用时会将文本右移,于是不得不对右下角位置和其他位置区别使用。

另一个稍好的解决办法是将addch用try…except…包起来并忽略错误,像下面这样:

#!/usr/bin/python2

import curses
import time

stdscr = curses.initscr()
h, w = stdscr.getmaxyx()

try:
    stdscr.addch(h-1, w-1, '*')
except curses.error:
    pass

stdscr.refresh()
time.sleep(3)
curses.endwin()

这样虽然不用对不同位置分别处理了,可是每次使用addch/addstr都要加try…except…不是很烦?因为多数情况下并不关心添加的内容是否超出 了窗口。

C里面就工作得好好的:

#include <ncurses.h>

int main()
{
    initscr();

    /* get window size */
    int h,w;
    getmaxyx(stdscr, h, w);

    mvaddch(h-1, w-1, '*');
    refresh();

    sleep(3);

    endwin();
    return 0;
}

虽然超出窗口有必要提醒一下,但总应该设置个选项允许忽略这个问题吧,某种意义上说这也算个bug了。

Links: