首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_curses.error: addstr()返回错误

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

Stack Overflow用户
提问于 2015-08-30 14:43:01
回答 2查看 13.5K关注 0票数 4

使用Python,我正在尝试写一个脚本,当你按空格键时,它会将所有键入的字符转换为'a‘。例如,我输入"python“,然后输入空格,然后"python”将转换为"aaaaaa“。

代码语言:javascript
复制
import argparse
import curses
import time

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

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

        if s == curses.KEY_ENTER or s==10 or s==13:
            dim = screen.getyx()
            screen.move(dim[0]+1,0)
            screen.refresh()

        #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()

上面的代码在第一行运行得很好,但是在第二行,每当我按空格键的时候,我在第22行得到一个错误,说"_curses.error: addstr() returned“

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

EN

回答 2

Stack Overflow用户

发布于 2015-08-30 15:08:58

代码语言:javascript
复制
if s != ord(' ') and s != ord('\x1b') and s != curses.KEY_BACKSPACE:
    str_txt += chr(int(s))
    count+=1

if语句为回车符和换行符执行,我认为,由于第一行的原因,我认为您的计数比预期的多了1。

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

代码语言:javascript
复制
screen.addstr(dim[0],dim[1]-count-1, h)

由于第一行末尾的回车(\r),您的计数是+1。第一个if应该检查这一点,并且不增加计数。尝试将这些检查s!=curses.KEY_ENTER and s!=10 and s!=13添加到第一个if中,看看这是否有帮助。s!=10将检查新行字符(\n) (在这种情况下,这可能不是必需的,但我是OCD)。s!=13将检查回车符(\r)。

票数 5
EN

Stack Overflow用户

发布于 2015-08-31 09:11:03

对于给定的示例,需要改进的地方不止一个。以下是修订版:

代码语言:javascript
复制
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)与空格的行为不同。

  • enter/return后的移动移动了两行而不是一行。

  • 屏幕不会在结尾滚动(本例中为部分修复)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32293981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档