4

使用 Python,我正在尝试编写一个脚本,该脚本将在您按下空格键时将所有键入的字符转换为“a”。例如,我输入“python”,然后输入空格,然后“python”将转换为“aaaaaa”。

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 ERR”

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

在此处输入图像描述

4

2 回答 2

5
if s != ord(' ') and s != ord('\x1b') and s != curses.KEY_BACKSPACE:
    str_txt += chr(int(s))
    count+=1

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

addstr() 返回的 ERR 异常是因为光标被移出屏幕(超出范围),原因是:

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)(在这种情况下可能不需要,但我是强迫症)。s!=13将检查回车符 (\r)。

于 2015-08-30T07:08:58.207 回答
1

有不止一个地方可以改进给定的示例。这是一个修订版:

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 之后的移动移动了两行而不是一行。
  • 屏幕最后不会滚动(本例中的部分修复)
于 2015-08-31T01:11:02.963 回答