【问题标题】:ncurses 10,10 pad causes error when addstr to 9, 9ncurses 10,10 pad 在 addstr 到 9, 9 时会导致错误
【发布时间】:2013-05-26 21:01:41
【问题描述】:

在声明一个 10 x 10 的 pad 后,我显然无法在没有错误的情况下写入右下角 9、9。这是怎么回事?

import curses

def start(stdscr):
    curses.curs_set(0)
    movement = curses.newpad(10, 10)

    movement.addstr(8, 9, '+')
    movement.addstr(9, 8, '+') 
    movement.addstr(9, 9, '+') #This line causes an error

if __name__ == '__main__':
    curses.wrapper(start)

原因:

  File "curses_movement_testing.py", line 35, in <module>
    curses.wrapper(start)
  File "/usr/lib64/python2.6/curses/wrapper.py", line 43, in wrapper
    return func(stdscr, *args, **kwds)
  File "curses_movement_testing.py", line 10, in start
    movement.addstr(9, 9, '+')
_curses.error: addstr() returned ERR

为什么我不能写到右下角的单元格?

【问题讨论】:

    标签: python ncurses python-curses


    【解决方案1】:

    问题是添加的字符导致尝试滚动键盘,并且滚动被禁用。角色已成功添加(至少在我的系统的 ncurses 实现中):如果您发现错误并更新屏幕,您应该会看到它:

    import curses, time
    
    def start(stdscr):
        curses.start_color()
        try:
            curses.curs_set(0)
        except curses.error:
            pass
        movement = curses.newpad(10, 10)
    
        movement.addstr(8, 9, '+')
        movement.addstr(9, 8, '+')
        try:
            movement.addstr(9, 9, '+')
        except curses.error:
            movement.addstr(0, 0, 'CAUGHT')
        movement.refresh(0, 0, 0, 0, 9, 9)
        curses.doupdate()
        time.sleep(1)
    
    if __name__ == '__main__':
        curses.wrapper(start)
    

    如果你在写到右下角之前调用movement.scrollok(True),不会出错但是窗口会滚动:可能不是你想要的。

    由于焊盘可能比实际屏幕大,一个简单的解决方案是在您将要使用的部分下方添加一个额外的行refresh。您可以检查是否已写入不会显示的部分。这是最后一个例子:

    import curses, sys, time
    
    def start(stdscr):
        curses.start_color()
        try:
            curses.curs_set(0)
        except curses.error:
            pass
        movement = curses.newpad(11, 10)
    
        movement.addstr(8, 9, '+')
        movement.addstr(9, 8, '+')
        text = sys.argv[1] if len(sys.argv) > 1 else '+'
        try:
            movement.addstr(9, 9, text)
            y, x = movement.getyx()
        except curses.error:
            y, x = movement.getyx()
            movement.addstr(0, 0, 'CAUGHT')
        if y >= 10 and x > 0:
            movement.addstr(1, 0, 'toolong')
        movement.refresh(0, 0, 0, 0, 9, 9)
        curses.doupdate()
        time.sleep(1)
    
    if __name__ == '__main__':
        curses.wrapper(start)
    

    python cursesx.py 运行并出现加号;以python cursesx.py foo 运行,出现ftoolong 消息;以python cursesx.py waytoolongtofit 运行,wCAUGHTtoolong 消息都会出现。

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多