如果您阅读了 curses move 的文档(例如http://linux.die.net/man/3/move):
这些例程在失败时返回 ERR,在成功完成时返回 OK(SVr4 仅指定“ERR 以外的整数值”)。
具体来说,如果窗口指针为空,或者位置在窗口之外,它们会返回错误。
第一个似乎不太可能出现在 Python 中,所以第二个可能是你的问题。快速测试表明,在 30 行或更高的终端上运行代码可以正常运行,但在典型的 24 行或 25 行终端上会失败。
如果你想让调试更容易,首先将整个东西包装在try
/中finally:
curses.endscr()
(这样你的终端就不会乱成一团,可能无法看到输出)。然后将调用包装stdscr.move
在一个记录 x 和 y 的try
/except:
中,这样你就知道它在哪里失败了。我还将“30”变成一个命令行参数,以便更快地进行测试。这是一个包含所有这些更改的版本:
#!/usr/bin/python
import sys
import curses
height = int(sys.argv[1]) if len(sys.argv) > 1 else 24
try:
stdscr = curses.initscr()
curses.noecho();
palette = [' ', ' ', '.', '.', '/', 'c', '(', '@', '#', '8']
index = 0
for x in xrange(50):
for y in xrange(height):
index = (index + 1) % len(palette)
try:
stdscr.move(y,x)
except Exception as e:
stdscr.refresh()
curses.endwin()
print
print x, y, e
sys.exit(1)
stdscr.addch(palette[index])
stdscr.refresh()
finally:
curses.endwin()
现在python cursetest 30
打印:
0 25 wmove() returned ERR
所以,正如我所怀疑的,它在 x=0,y=25 处失败。
如果我将终端扩展到 80x50,它可以工作,但现在python cursetest 60
失败了:
0 50 wmove() returned ERR
就此而言,如果我将终端缩小到 40x50,则会python cursetest 30
在水平边缘而不是垂直边缘失败:
40 0 wmove() returned ERR
如果您想提前检查而不是在错误发生时尝试捕获错误,请尝试getmaxyx()
在窗口上调用;如果 y<30,您可以显示一个很好的错误消息并退出(或做一些不同的事情,或其他)。
最后,快速检查表明这在 C 中也不起作用。当然不会抛出异常,如果你愿意,你可以忽略返回的错误,但你最终会连续写入位置 (24, 49) 300 次。(如果你真的想要的话,你可以在 Python 中通过尝试/捕捉/传递移动来做同样的事情……)