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 的答案)
这感觉像是一个非常微不足道的问题,但经过几个小时的搜索和试验后,我无法找到一个解决方案。
我正在使用 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 的答案)