Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ncurses 10,10 pad在将str添加到9,9时导致错误_Python_Ncurses_Python Curses - Fatal编程技术网

Python ncurses 10,10 pad在将str添加到9,9时导致错误

Python ncurses 10,10 pad在将str添加到9,9时导致错误,python,ncurses,python-curses,Python,Ncurses,Python Curses,在声明了一个10乘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 ca

在声明了一个10乘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
文件“curses\u movement\u testing.py”,第35行,在
curses.wrapper(开始)
文件“/usr/lib64/python2.6/curses/wrapper.py”,第43行,在wrapper中
返回函数(stdscr,*args,**kwds)
文件“curses\u movement\u testing.py”,第10行,开头
movement.addstr(9,9,“+”)
_curses.error:addstr()返回错误

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

问题是添加的字符导致尝试滚动键盘,并且滚动被禁用。字符已成功添加(至少在我的系统的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)
,则不会出现错误,但窗口将滚动:可能不是您想要的

由于pad可能比实际屏幕大,一个简单的解决方案是在要刷新的部件下方添加一条额外的线。您可以检查是否已写入将不显示的零件。最后一个例子是:

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 cursex.py
的形式运行,会出现加号;以
python cursex.py foo
运行,会出现
f
toolong
消息;以
python cursex.py waytoolongtofit
运行,
w
catch
toolong
消息都会出现