2016-04-03 82 views
4

我开始学习python中的curses。我在Mac上使用python 3.5。当我尝试在左下角程序崩溃写,出现以下错误:诅咒在右下角调用addch

$ python ex_curses.py 
[...] 
    File "ex_curses.py", line 19, in do_curses 
    screen.addch(mlines, mcols, 'c') 
    _curses.error: add_wch() returned ERR 

示例程序是:

import curses 

def do_curses(screen): 
    curses.noecho() 
    curses.curs_set(0) 
    screen.keypad(1) 

    (line, col) = 12, 0 
    screen.addstr(line, col, "Hello world!") 
    line += 1 
    screen.addstr(line, col, "Hello world!", curses.A_REVERSE) 

    screen.addch(0, 0, "c") 

    (mlines, mcols) = screen.getmaxyx() 
    mlines -= 1 
    mcols -= 1 
    screen.addch(mlines, mcols, 'c') 

    while True: 
     event = screen.getch() 
     if event == ord("q"): 
      break 
    curses.endwin() 

if __name__ == "__main__": 
    curses.wrapper(do_curses) 

我感觉我已经失去了一些东西明显。但我不知道是什么。

回答

1

这是预期的行为(怪癖),因为addch尝试在添加字符后将换行到下一行。有一个comment in lib_addch.c处理此:

/* 
* The _WRAPPED flag is useful only for telling an application that we've just 
* wrapped the cursor. We don't do anything with this flag except set it when 
* wrapping, and clear it whenever we move the cursor. If we try to wrap at 
* the lower-right corner of a window, we cannot move the cursor (since that 
* wouldn't be legal). So we return an error (which is what SVr4 does). 
* Unlike SVr4, we can successfully add a character to the lower-right corner 
* (Solaris 2.6 does this also, however). 
*/ 
1

对于未来的读者。在@Thomas Dickey回答后,我在代码中添加了以下代码片段。

try: 
    screen.addch(mlines, mcols, 'c') 
except _curses.error as e: 
    pass 

现在我的代码如下所示:

import curses 
import _curses 

def do_curses(screen): 
    curses.noecho() 
    curses.curs_set(0) 
    screen.keypad(1) 

    (line, col) = 12, 0 
    screen.addstr(line, col, "Hello world!") 
    line += 1 
    screen.addstr(line, col, "Hello world!", curses.A_REVERSE) 

    screen.addch(0, 0, "c") 

    (mlines, mcols) = screen.getmaxyx() 
    mlines -= 1 
    mcols -= 1 
    try: 
     screen.addch(mlines, mcols, 'c') 
    except _curses.error as e: 
     pass 

    while True: 
     event = screen.getch() 
     if event == ord("q"): 
      break 
    curses.endwin() 

if __name__ == "__main__": 
    curses.wrapper(do_curses)