为什么在Python诅咒中escape键有延迟?

为什么在Python诅咒中escape键有延迟?,python,keyboard,python-curses,Python,Keyboard,Python Curses,在Pythoncurses模块中,我观察到在按下esc键和getch()返回之间大约有1秒的延迟。对于其他键,此延迟似乎不会发生。为什么会发生这种情况?我能做些什么 测试用例: import curses import time def get_delay(window, key): while True: start = time.time() ch = window.getch() end = time.time()

在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

Curses处理来自终端的“转义序列”,以表示软件的命令。这些序列通常以转义字符开头。因此,,当您点击ESC时,curses代码不会立即发出任何信息,以防这表示转义序列的开始。

ESCDELAY=25…将其置于全局。

为了自定义ESC延迟,您可以设置curses使用的环境变量ESCDELAY,以毫秒为单位确定它在传递转义之前等待的时间钥匙

例如,为了在Python中定义此变量,可以在调用
curses.wrapper(main)
之前调用以下函数:

如果之前未设置,则将环境变量设置为25ms


另请参阅(搜索ESCDELAY)。

延迟是等待以下字符,这些字符可能构成有效的转义序列。是否有办法更改此行为?我不知道,但我相当怀疑-它是由运行诅咒的终端的能力驱动的。此参数控制什么?单位是什么?如何设置它?嗯,好的,没有OSX,但是根据这一点,ncurses应该知道ESCDELAY环境变量。这可以工作,但必须在初始化curses之前调用它。在C中,有两个函数名为
set\u ESCDELAY
get\u ESCDELAY
。使用这些功能时,延迟以毫秒为单位进行测量。
def set_shorter_esc_delay_in_os():
    os.environ.setdefault('ESCDELAY', '25')