Почему escape-ключ имеет задержку в проклятиях Python?

В питоне curses модуль, я заметил, что между нажатием клавиши ESC и getch() возвращение. Эта задержка не возникает для других ключей. Почему это происходит и что я могу с этим сделать?

Прецедент:

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

4 ответа

Решение

Чтобы настроить задержку Esc, вы можете установить переменную окружения ESCDELAY, которую curses использует для определения времени в миллисекундах, которое оно ожидает, прежде чем выдаст Escape-ключ.

Чтобы определить эту переменную в Python, вы можете, например, вызвать следующую функцию перед вызовом curses.wrapper(main):

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

который установит переменную окружения на 25 мс, если она не была установлена ​​ранее.

Смотрите также справочную страницу ncurses (поиск ESCDELAY).

Curses имеет дело с "escape-последовательностями" вашего терминала для представления команд программному обеспечению. Эти последовательности обычно начинаются с escape-символа. Следовательно, когда вы нажимаете ESC, код curses не генерирует ничего немедленно, если это представляет начало escape-последовательности.

ESCDELAY=25 ... положить это в глобальном.

Для тех, кто еще ищет, добавлен Python 3.9.curses.get_escdelay()иcurses.set_escdelay(ms)для контроля задержки послеESCнажимается. Единицы измерения — миллисекунды. См. документы .

Например, вызов

      curses.set_escdelay(25)

установит задержку на 25 миллисекунд.

Теперь, когда это доступно, я думаю, что это чище, чем принятый метод:

      os.environ.setdefault('ESCDELAY', '25')
Другие вопросы по тегам