Python Ncurses打印一个char来定位

时间:2012-09-12 22:16:12

标签: python terminal ncurses curses

我对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()

1 个答案:

答案 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来做同样的事情......)