Python + curses中窗口的最后一个字符是什么?

15
以下程序会引发错误:
import curses

def test(scr):
  top = curses.newwin(1, 10, 0, 0)
  top.addstr(0, 9, "X")

curses.wrapper(test)

看起来每当我尝试使用addstr()在窗口的最后一行的最后一列写入字符时(即使它比屏幕小),它就会引发一个错误。 我不想滚动,我不关心光标的位置。 我只想能够在窗口的每个位置写入字符。 这是可能的吗? 我该如何做到这一点?


相关链接:http://stackoverflow.com/questions/10877469 - augurar
2个回答

11

根据历史原因,看起来在curses中仅仅写入一个窗口的最后一个字符是不可能的。

我找到的唯一解决办法是将字符写在其最终位置的左边一个位置,并使用插入命令推送它。以下代码会将字符"X"推送到第9个位置:

top = curses.newwin(1, 10, 0, 0)
top.addstr(0, 8, "X")
top.insstr(0, 8, " ")

8
原来实际上确实会写入最后一个位置,只是紧接着就会引发错误。因此,如果您可以容忍以下hack/不优雅的解决方法:
#! /usr/bin/env python
import curses

def test(scr):
    top = curses.newwin(1, 10, 0, 0)
    try:
        top.addstr(0, 9, "X")
    except curses.error:
        pass

curses.wrapper(test)

即忽略错误并使代码更加简单易于设计和实现。保留错误的方式会让代码变得复杂

我喜欢这种方法。虽然不是很干净,但是我是这样处理的:我将窗口(其类不明确)包装在BaseWindow类中,在其中定义了所有我的方法。该类通过实现__getattr__解决窗口方法名称,例如addstr,从而返回实际窗口的属性。我将该方法适应到了addstr方法上:我的BaseWindow现在定义了自己的addstr方法,尝试调用实际窗口的addstr方法,并静默传递任何curses.error异常。 - Right leg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接