簡體   English   中英

_curses.error:addstr()返回ERR

[英]_curses.error: addstr() returned ERR

使用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()返回ERR”

編輯:當我將screen.addstr(dim [0],dim 1 -count-1,h)更改為screen.addstr(dim [0],dim 1 -count,h)時,錯誤被消除但輸出不是我想要的是。 我已附加輸出供您參考。

在此輸入圖像描述

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

有不止一個地方可以改進給定的例子。 這是修訂版:

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(或返回)並不表示與空格“相同”。
  • 進入/返回后的運動移動了兩條線而不是一條線。
  • 屏幕最后不會滾動(本例中的部分修復)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM