我对ncurses不是这样,但它应该在C上工作,我不知道出了什么问题,我只是想连续打印一些字符到屏幕但是我找不到如何解决这个错误:
File "capture.py", line 37, in <module>
stdscr.move(y,x)
_curses.error: wmove() returned ERR
代码:
(irrelevant parts of the code are removed)
import curses
stdscr = curses.initscr()
curses.noecho();
palette = [' ', ' ', '.', '.', '/', 'c', '(', '@', '#', '8']
# index is something between 0 and len(palette), not important
for x in xrange(50):
for y in xrange(30):
stdscr.move(y,x)
sdtscr.addch(palette[index])
stdscr.refresh()
答案 0 :(得分:5)
如果您阅读了curses移动的文档(例如,http://linux.die.net/man/3/move):
这些例程在成功完成时会在失败时返回ERR并且OK(SVr4仅指定“ERR以外的整数值”)。
具体来说,如果窗口指针为空,或者位置在窗口之外,它们会返回错误。
第一个似乎不太可能出现在Python中,所以第二个可能是你的问题。快速测试表明,运行代码在30行或更高的终端上工作正常,但在典型的24行或25行终端上运行失败。
如果你想让它更容易调试,首先将整个内容包装在try
/ finally:
curses.endscr()
中(这样你的终端就不会乱七八糟,可能会使无法看到输出)。然后将调用包裹在stdscr.move
/ try
中,记录x和y,以便了解失败的位置。我还将“30”变成命令行参数,以便更快地进行测试。这是一个包含所有这些变化的版本:
except:
现在#!/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
所以,正如我所怀疑的那样,它在x = 0,y = 25时失败。
如果我将终端扩展到80x50,它可以工作,但现在0 25 wmove() returned ERR
失败了:
python cursetest 60
就此而言,如果我将终端缩小到40x50,0 50 wmove() returned ERR
会在水平边缘而不是垂直边缘失败:
python cursetest 30
如果您想提前检查,而不是在发生错误时尝试捕获错误,请尝试在窗口上调用40 0 wmove() returned ERR
;如果y <30,你可以显示一条漂亮的错误信息并退出(或做一些不同的事情或其他事情)。
最后,快速检查表明这在C中也不起作用。当然没有异常抛出,如果你愿意,你可以忽略返回的错误,但你最终会连续300次写入位置(24,49)。 (如果你真的想要的话,你可以在Python中通过try / catch / pass来做同样的事情......)