为什么在Python诅咒中escape键有延迟?
在Python为什么在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()
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')