为什么转义键在Python curses中有延迟?

aug*_*rar 12 python keyboard python-curses

在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))
Run Code Online (Sandbox Code Playgroud)

结果:

Escape delay: 1001.09195709 ms
Space delay: 0.00596046447754 ms
Run Code Online (Sandbox Code Playgroud)

Sal*_*alo 15

为了自定义Esc延迟,您可以设置curses使用的环境变量ESCDELAY,以确定它在传递Escape键之前等待的时间(以毫秒为单位).

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

def set_shorter_esc_delay_in_os():
    os.environ.setdefault('ESCDELAY', '25')
Run Code Online (Sandbox Code Playgroud)

如果之前没有设置,它会将环境变量设置为25ms.

另请参见ncurses手册页(搜索ESCDELAY).

  • 这有效,但必须在初始化curses之前调用它. (2认同)
  • 在 C 中,有两个名为“set_escdelay”和“get_escdelay”的函数。使用这些函数时,延迟以毫秒为单位。 (2认同)