在Python curses
模块中,我观察到按 esc 键和getch()
返回之间有大约1秒的延迟。其他键似乎没有发生此延迟。为什么会发生这种情况,我该怎么办呢?
测试用例:
import curses
import time
def get_delay(window, key):
while True:
start = time.time()
ch = window.getch()
end = time.time()
if ch == key:
return end-start
def main(stdscr):
stdscr.clear()
stdscr.nodelay(1)
stdscr.addstr("Press ESC")
esc_delay = get_delay(stdscr, 27)
stdscr.addstr("\nPress SPACE")
space_delay = get_delay(stdscr, ord(' '))
return esc_delay, space_delay
if __name__ == '__main__':
esc_delay, space_delay = curses.wrapper(main)
print("Escape delay: {} ms".format(esc_delay*1000))
print("Space delay: {} ms".format(space_delay*1000))
结果:
Escape delay: 1001.09195709 ms
Space delay: 0.00596046447754 ms
答案 0 :(得分:14)
为了自定义Esc延迟,您可以设置curses使用的环境变量ESCDELAY来确定它在传递Escape键之前等待的时间(以毫秒为单位)。
为了在Python中定义此变量,您可以在调用curses.wrapper(main)
之前调用以下函数:
def set_shorter_esc_delay_in_os():
os.environ.setdefault('ESCDELAY', '25')
如果之前没有设置环境变量,则将其设置为25ms。
另请参阅man page of ncurses(搜索ESCDELAY)。
答案 1 :(得分:2)
Curses处理来自终端的“转义序列”以表示对软件的命令这些序列通常以转义字符开头。因此,当您按ESC时,如果这代表转义序列的开始,则curses代码不会立即发出任何内容。
答案 2 :(得分:1)
ESCDELAY = 25 ......把它放在全球范围内。