Python Curses正在检测以前按下的键

Python Curses正在检测以前按下的键,python,sleep,keyboard-events,curses,Python,Sleep,Keyboard Events,Curses,这感觉像是一个非常琐碎的问题,但经过数小时的搜索和实验,我无法找到一个单一的解决方案 我用咒语用键盘键移动我的机器人,它按预期工作,但有一件事,每次点击“getch()”时,它会执行之前按下的键,即使没有按下任何键,这会造成“滞后”情况 这是一个非常简单的场景,我创建来解释我自己,在这里让我们说,我按下“a”,它工作正常,我保持按下约4秒,然后释放,现在,即使没有按下任何按钮,此代码也会一次又一次地执行,因为curses会对我在此期间按下的所有“a”执行x次。sleep: import curs

这感觉像是一个非常琐碎的问题,但经过数小时的搜索和实验,我无法找到一个单一的解决方案

我用咒语用键盘键移动我的机器人,它按预期工作,但有一件事,每次点击“getch()”时,它会执行之前按下的键,即使没有按下任何键,这会造成“滞后”情况

这是一个非常简单的场景,我创建来解释我自己,在这里让我们说,我按下“a”,它工作正常,我保持按下约4秒,然后释放,现在,即使没有按下任何按钮,此代码也会一次又一次地执行,因为curses会对我在此期间按下的所有“a”执行x次。sleep:

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()
所以我想,嗯,我不想这么做,但我会在检查钥匙之前完全杀死诅咒并再次连接它,但即使在这样做之后,诅咒似乎也会拾取它不应该拾取的钥匙(而且我真的不喜欢这种方法,我觉得如果我要一次又一次地使用它,我不应该像这样关闭它),此场景将出现与上述场景相同的问题:

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()
如果可能的话,一些不会强迫我杀死并重新启动一切的东西,看起来你需要

刷新所有输入缓冲区。这就扔掉了之前的任何类型 由用户键入,但尚未由程序处理


最终,您可以尝试删除重复的关键点

new_key = stdscr.getch()

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

key = new_key

(可在
C
code in answer for中找到)

我不确定,但某些系统或语言(或可能是控制台)具有在系统开始重复按键之前设置延迟的功能,并且可能会停止重复按键。在C/C++代码的另一个问题中,我看到了
while
循环,它得到char并与以前的值进行比较,直到得到新值。我还将检查
stdscr
是否有要清除缓冲区的内容。也许可以尝试是!我不明白,在谷歌搜索了这么多之后,我到底是怎么没有想到这一点的,但似乎完全按照我的要求去做了。我找到它只是因为我在搜索
flush()
,它在一些缓冲区中用于删除或发送数据。