诅咒正在检测先前按下的键

时间:2020-05-27 19:56:37

标签: python sleep keyboard-events curses

这似乎是一个非常琐碎的问题,但经过数小时的搜索和试验后,我无法找到一个解决方案。

我正在使用诅咒通过键盘按键移动机器人,它可以按预期工作,但有一点是,每次按下“ getch()”,即使没有按下任何按键,它也会执行以前按下的按键,造成“滞后”情况。

这是我创建的一个非常简单的场景,用以说明自己,在这里,我按了“ a”键,它可以正常工作,我再按住它约4秒钟然后释放,现在此代码将再次执行即使没有按下任何按钮,因为curses会对我在这段时间内按下的所有'a'执行x次。

npm-merge-driver

所以我想,我不想这么做,但是在检查密钥之前,我将完全杀死curses并再次连接它,但是即使在执行完curses之后,它似乎仍在捡拾它不应该使用的密钥(而且我真的不喜欢这种方法,我觉得如果我要一遍又一遍地使用它,就不需要像这样关闭它了),这种情况与上面的情况同样存在问题:

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

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

1 个答案:

答案 0 :(得分:1)

似乎您需要curses.flushinp()

刷新所有输入缓冲区。这会丢弃任何已经 由用户输入,尚未由程序处理。


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

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的答案)

相关问题