Почему 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-последовательности.
Для тех, кто еще ищет, добавлен Python 3.9.curses.get_escdelay()
иcurses.set_escdelay(ms)
для контроля задержки послеESC
нажимается. Единицы измерения — миллисекунды. См. документы .
Например, вызов
curses.set_escdelay(25)
установит задержку на 25 миллисекунд.
Теперь, когда это доступно, я думаю, что это чище, чем принятый метод:
os.environ.setdefault('ESCDELAY', '25')