这似乎是一个非常琐碎的问题,但经过数小时的搜索和实验后,我无法找到一个解决方案。
我正在使用诅咒通过键盘按键移动机器人,它按预期工作,但有一点是,每当按下“ 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()
[如果可能的话,不会迫使我杀死并重新启动一切]
似乎您需要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代码中找到]