首頁 >後端開發 >Python教學 >如何在腳本中偵測來自終端的鍵盤輸入?

如何在腳本中偵測來自終端的鍵盤輸入?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-29 22:00:29513瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn