Curses 正在检测之前按下的键

Curses is detecting previous pressed keys

这感觉像是一个非常微不足道的问题,但经过几个小时的搜索和试验后,我无法找到一个解决方案。

我正在使用 curses 来使用键盘键移动我的机器人,它按预期工作,但有一点,每次按下 "getch()" 它都会执行之前按下的键,即使没有任何东西被按下按下,这会造成 'lag' 情况。

这是我创建的一个非常简单的场景来解释我自己,在这里假设我按下 'a',它工作正常,我再按住它大约 4 秒然后松开,现在这段代码即使没有按下任何东西,也会一次又一次地执行,因为 curses 会为我在 time.sleep:

期间按下的所有 'a' 执行 x 次
import curses
import time
stdscr = None

def SetupCurses():
    global stdscr
    stdscr = curses.initscr()
    curses.cbreak()
    stdscr.keypad(1)


def StartCurse():

    key = ''
    while key != ord('q'):
        stdscr.clear()
        stdscr.refresh()
        key = stdscr.getch()
        if key == ord('a'):
            print("\nyou pressed a\n")
            time.sleep(5)
            print("\nyou can press a again\n")
            time.sleep(1)

while(True):
    SetupCurses()
    StartCurse()

所以我想,好吧,我不想那样做,但我会完全杀死 curses 并在检查密钥之前重新连接它,但即使这样做之后,curses 似乎也在拾取它不应该的密钥' t(而且我真的不喜欢这种方法,我觉得如果我会一次又一次地使用它,我不应该像这样关闭它),这种情况会出现与上述情况相同的问题:

import curses
import time
stdscr = None

def SetupCurses():
    global stdscr
    stdscr = curses.initscr()
    curses.cbreak()
    stdscr.keypad(1)


def StartCurse():

    key = ''
    while key != ord('q'):
        stdscr.clear()
        stdscr.refresh()
        key = stdscr.getch()
        if key == ord('a'):
            break

def EndCurse():
    global stdscr
    curses.nocbreak()
    stdscr.keypad(False)
    curses.echo()
    curses.endwin()
    stdscr = None

while(True):  
    SetupCurses()

    print("\nyou can press a again\n")
    time.sleep(1)

    StartCurse()  
    EndCurse()

    time.sleep(5)
    print("\nyou pressed a\n")

我的问题是:是否有某种代码可以:

curses.ClearAnyPreviousInput()
ThisKeyIsBeingPressedRightNow = stdscr.getch()

如果可能的话,不要强迫我杀死并重新启动一切

看来你需要curses.flushinp()

Flush all input buffers. This throws away any typeahead that has been typed by the user and has not yet been processed by the program.


最后你可以尝试删除重复的键

new_key = stdscr.getch()

while new_key == key:
      new_key = stdscr.getch()

key = new_key

(在 C 代码中找到 Configure key repeat delay to detect if key is being pressed 的答案)