Python _curses.error:addstr()返回错误

Python _curses.error:addstr()返回错误,python,python-2.7,python-3.x,curses,python-curses,Python,Python 2.7,Python 3.x,Curses,Python Curses,使用Python,我试图编写一个脚本,每当您按下空格键时,它会将所有键入的字符转换为“a”。例如,我先键入“python”,然后键入空格,然后将“python”转换为“aaaaa” 上面的代码在第1行可以正常工作,但是,在第2行中,每当我按下空格键时,第22行就会出现一个错误:“_curses.error:addstr()returned ERR” 编辑: 当我将screen.addstr(dim[0],dim-count-1,h)更改为screen.addstr(dim[0],dim-coun

使用Python,我试图编写一个脚本,每当您按下空格键时,它会将所有键入的字符转换为“a”。例如,我先键入“python”,然后键入空格,然后将“python”转换为“aaaaa”

上面的代码在第1行可以正常工作,但是,在第2行中,每当我按下空格键时,第22行就会出现一个错误:“_curses.error:addstr()returned ERR”

编辑: 当我将screen.addstr(dim[0],dim-count-1,h)更改为screen.addstr(dim[0],dim-count,h)时,错误被消除,但输出不是我想要的。我已附上输出供您参考

我认为if语句也是为回车符和\或换行符执行的,所以我认为由于第一行,您的计数比您预期的多1

addstr()返回的错误异常是由于以下原因导致光标被移出屏幕(超出范围):


由于第一行末尾的回车(\r),您的计数为+1。第一个if应检查此项,而不是增加计数。尝试添加这些检查
s=诅咒,钥匙,快进去=10和s=13
查看第一个if,看看是否有帮助<代码>s=10将检查新行字符(\n)(在这种情况下可能不需要,但我是强迫症患者)<代码>s=13将检查回车符(\r)。

有多个地方可以改进给定的示例。以下是修订版:

import curses
import time

# Main Function
def main():
    screen=curses.initscr()
    curses.cbreak()
    screen.keypad(1)
    curses.echo()
    screen.scrollok(1)
    str_txt=''
    count = 0
    while True:
        dim = screen.getyx()
        s=screen.getch()
        if s != ord(' ') and s != ord('\x1b') and s != curses.KEY_BACKSPACE and s != curses.KEY_ENTER and s != 10 and s != 13:
            str_txt += chr(int(s))
            count+=1

        if s == ord(' '):
            if count > 0:
                h = 'a'*len(str_txt)+' '
                screen.addstr(dim[0],dim[1]-count, h)
                count=0
                str_txt=''

        if s == curses.KEY_ENTER or s==10 or s==13:
            if count > 0:
                h = 'a'*len(str_txt)
                screen.addstr(dim[0],dim[1]-count, h)
                count=0
                str_txt=''
            screen.move(dim[0]+1,0)
            count=0
        str_txt=''

        #if s == curses.KEY_BACKSPACE:
        #   dim = screen.getyx()
        #   screen.move(dim[0],dim[1])
        #   screen.refresh()

        if s == ord('\x1b'):
            curses.endwin()
            break

if __name__  == "__main__":
    main()
例如:

  • 不需要screen.refresh调用,因为screen.getch会这样做
  • 未进行检查以确保计数为非零
  • 按enter键(或return键)与空格键的行为不同
  • 回车后的移动移动了两行而不是一行
  • 屏幕不会在末尾滚动(本例中为部分修复)

它不起作用。虽然它解决了我的另一个问题,所以谢谢你。我已经按照您的建议更新了代码。但是上面的错误仍然存在。您可以在screen.addstr(dim[0],dim[1]-count-1,h)和debug处设置断点吗?我似乎无法在Python2.7上安装curses。curses模块仅适用于linux版本,默认情况下,您不必在linux中安装任何东西。我使用的是终端,所以我不知道如何在代码中使用断点。我对问题进行了编辑,以向您提供更多信息,如果这有帮助的话,当您取出1偏移量时,输出是什么?计数仍然是1,超过换行符后的值。这就是为什么在第一行之后,每行上的第一个字符序列在没有-1偏移量的情况下工作,并随之中断。也许您可以添加一些print语句来回显count和str_txt变量。这将有助于调试。
if s != ord(' ') and s != ord('\x1b') and s != curses.KEY_BACKSPACE:
    str_txt += chr(int(s))
    count+=1
screen.addstr(dim[0],dim[1]-count-1, h)
import curses
import time

# Main Function
def main():
    screen=curses.initscr()
    curses.cbreak()
    screen.keypad(1)
    curses.echo()
    screen.scrollok(1)
    str_txt=''
    count = 0
    while True:
        dim = screen.getyx()
        s=screen.getch()
        if s != ord(' ') and s != ord('\x1b') and s != curses.KEY_BACKSPACE and s != curses.KEY_ENTER and s != 10 and s != 13:
            str_txt += chr(int(s))
            count+=1

        if s == ord(' '):
            if count > 0:
                h = 'a'*len(str_txt)+' '
                screen.addstr(dim[0],dim[1]-count, h)
                count=0
                str_txt=''

        if s == curses.KEY_ENTER or s==10 or s==13:
            if count > 0:
                h = 'a'*len(str_txt)
                screen.addstr(dim[0],dim[1]-count, h)
                count=0
                str_txt=''
            screen.move(dim[0]+1,0)
            count=0
        str_txt=''

        #if s == curses.KEY_BACKSPACE:
        #   dim = screen.getyx()
        #   screen.move(dim[0],dim[1])
        #   screen.refresh()

        if s == ord('\x1b'):
            curses.endwin()
            break

if __name__  == "__main__":
    main()