ホームページ >バックエンド開発 >Python チュートリアル >スクリプトでターミナルからのキーボード入力を検出するにはどうすればよいですか?

スクリプトでターミナルからのキーボード入力を検出するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-29 22:00:29469ブラウズ

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

ターミナルからスクリプト内のキーボード入力を検出する方法

ニーズと操作に応じて、ターミナルからスクリプト内のキーボード入力を検出する方法がいくつかあります。 system.

同期/ブロック キー キャプチャ

このアプローチは、キーが押されるまでスクリプトをブロックし、その後、押されたキーを返します。

  • 単純な場合input または raw_input は、ユーザーが改行を押すと入力したテキストを返すブロック関数です。
  • ユーザーが 1 つのキーを押すのを待ってそのキーを返す単純なブロック関数の場合は、次のコードを使用します。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。