【问题标题】:Why does the escape key have a delay in Python curses?为什么转义键在 Python 诅咒中有延迟?
【发布时间】:2015-02-06 22:32:35
【问题描述】:

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

结果:

Escape delay: 1001.09195709 ms
Space delay: 0.00596046447754 ms

【问题讨论】:

  • 延迟是等待后面的可能构成有效转义序列的字符

标签: python keyboard python-curses


【解决方案1】:

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

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

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

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

另请参阅man page of ncurses(搜索 ESCDELAY)。

【讨论】:

  • 嗯,好吧,没有 OS X,但是根据这个man page,ncurses 应该知道 ESCDELAY 环境变量..
  • 这可行,但必须在初始化 curses 之前调用它。
  • 在 C 中,有两个函数名为 set_escdelayget_escdelay。使用这些函数时,延迟以毫秒为单位。
【解决方案2】:

Curses 处理来自终端的“转义序列”,以向软件表示命令。这些序列通常以转义字符开头。因此,当您按下 ESC 时,curses 代码不会立即发出任何内容,以防这表示转义序列的开始。

【讨论】:

  • 有没有办法改变这种行为?
  • 我不知道,但我很怀疑——它是由运行 curses 的终端的能力驱动的
【解决方案3】:

ESCDELAY=25 ...把​​这个放到全局中。

【讨论】:

  • 这个参数控制什么?有哪些单位?如何设置?
猜你喜欢
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 2012-04-08
  • 1970-01-01
  • 2014-04-17
  • 2010-09-24
相关资源
最近更新 更多