光标正在检测先前按下的键

问题描述 投票:0回答:1

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

我正在使用诅咒通过键盘按键移动机器人,它按预期工作,但有一点是,每当按下“ 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()

所以我想,嗯,我不想这样做,但是我会在检查密钥之前完全杀死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'):
            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()

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

python sleep keyboard-events curses
1个回答
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代码中找到]

© www.soinside.com 2019 - 2024. All rights reserved.