使用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()
上面的代码适用于第1行,但是,在第二行,每当我按空格键时,我在第22行收到错误说" _curses.error:addstr()返回ERR"
EDITED: 当我将screen.addstr(dim [0],dim 1 - count-1,h)更改为screen.addstr(dim [0],dim 1 - count,h)时,错误是消除但输出不是我想要的。我附上了输出供你参考。
答案 0 :(得分:4)
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
将检查新行char(\ n)(在这种情况下可能没有必要,但我是强迫症)。 s!=13
将检查回车符(\ r)。
答案 1 :(得分:0)
有不止一个地方可以改进给定的例子。这是修订版:
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()
例如: