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

上記のコードは 1 行目では問題なく動作しますが、2 行目でスペースバーを押すたびに、22 行目で「_curses.error: addstr() が 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) をチェックします (この場合は必要ないかもしれませんが、私は OCD です)。s!=13復帰文字 (\r) をチェックします。

于 2015-08-30T07:08:58.207 に答える