Why does the escape key have a delay in Python curses?

你。 提交于 2020-01-02 01:01:13

问题


In the Python curses module, I have observed that there is a roughly 1-second delay between pressing the esc key and getch() returning. This delay does not seem to occur for other keys. Why does this happen and what can I do about it?

Test case:

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))

Results:

Escape delay: 1001.09195709 ms
Space delay: 0.00596046447754 ms

回答1:


In order to customize the Esc delay you can set the environment variable ESCDELAY which curses uses to determine the time in milliseconds it waits before it delivers the Escape Key.

In order to define this variable in Python you could for example call the following function prior to your call to curses.wrapper(main):

def set_shorter_esc_delay_in_os():
    os.environ.setdefault('ESCDELAY', '25')

which will set the environment variable to 25ms if it has not been set before.

See also the man page of ncurses (search for ESCDELAY).




回答2:


Curses deals with "escape sequence"s from your terminal to represent commands to the software These sequences normally begin with an escape character. Consequently, when you hit ESC the curses code doesn't emit anything immediately in case this represents the start of an escape sequence.




回答3:


ESCDELAY=25 ...put this in global.



来源:https://stackoverflow.com/questions/27372068/why-does-the-escape-key-have-a-delay-in-python-curses

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!