首页 > 后端开发 > Python教程 > 如何在脚本中检测来自终端的键盘输入?

如何在脚本中检测来自终端的键盘输入?

Mary-Kate Olsen
发布: 2024-10-29 22:00:29
原创
526 人浏览过

How to Detect Keyboard Input from the Terminal in a Script?

如何从终端检测脚本中的键盘输入

有多种方法可以从终端检测脚本中的键盘输入,具体取决于您的需求和操作system.

同步/阻塞按键捕获

此方法会阻塞脚本,直到按下某个键,然后返回按下的键。

  • 对于简单input 或 raw_input,一个阻塞函数,一旦用户按下换行符,就会返回用户输入的文本。
  • 对于等待用户按下单个键然后返回该键的简单阻塞函数,请使用以下代码code.
<code class="python">class _Getch:
    """Gets a single character from standard input.  Does not echo to the
screen. From http://code.activestate.com/recipes/134892/"""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            try:
                self.impl = _GetchMacCarbon()
            except(AttributeError, ImportError):
                self.impl = _GetchUnix()

    def __call__(self): return self.impl()


class _GetchUnix:
    def __init__(self):
        import tty, sys, termios # import termios now or else you'll get the Unix version on the Mac

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()

class _GetchMacCarbon:
        """
        A function which returns the current ASCII key that is down;
        if no ASCII key is down, the null string is returned.  The
        page http://www.mactech.com/macintosh-c/chap02-1.html was
        very helpful in figuring out how to do this.
        """
        def __init__(self):
            import Carbon
            Carbon.Evt #see if it has this (in Unix, it doesn't)

        def __call__(self):
            import Carbon
            if Carbon.Evt.EventAvail(0x0008)[0]==0: # 0x0008 is the keyDownMask
                return ''
            else:
                #
                # The event contains the following info:
                # (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)[1]
                #
                # The message (msg) contains the ASCII char which is
                # extracted with the 0x000000FF charCodeMask; this
                # number is converted to an ASCII character with chr() and
                # returned
                #
                (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)[1]
                return chr(msg &amp; 0x000000FF)


def getKey():
    inkey = _Getch()
    import sys
    for i in xrange(sys.maxint):
        k=inkey()
        if k<>'':break

    return k</code>
登录后复制

异步按键捕获

  • 每当用户在命令提示符中键入一个键时,都会通过按下的键调用回调,甚至在解释器中输入内容时(键盘记录器)
  • 用户按下 Enter 键后使用键入的文本调用的回调(不太实时的键盘记录器)

轮询

  • 用户只是希望能够在按下某个键时执行某些操作,而不必等待该键(因此这应该是非阻塞的)。因此,他们调用 poll() 函数,该函数要么返回一个键,要么返回 None。这可以是有损的(如果它们在轮询之间花费太长时间,它们可能会错过一个键)或非有损的(轮询器将存储所有按下的键的历史记录,因此当 poll() 函数请求它们时,它们将始终被返回按按下的顺序)。
  • 与上面相同,只是轮询仅在用户按下换行符后返回一些内容。

机器人

  • 这些可以被调用来以编程方式触发键盘事件。这可以与按键捕获一起使用,以将它们回显给用户

以上是如何在脚本中检测来自终端的键盘输入?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板