2012-08-29 87 views
0

我試圖找出如何創建一個小的Python腳本,可以採取以下參數的計時器:如何閱讀鍵盤輸入一個字符,在一個時間與Python

  1. 提示 - 串
  2. 時間到停止

最後一個是字符我可以輸入數目的程序停止接受字符並開始處理該輸入之前之前等待作爲一個整數

  • 數量的字符。我見過一些人使用Python的select.select method,但是這並不包含第三項。我傾向於詛咒,儘管我不知道它是否支持讓我想到線程的超時。任何見解都會很棒!這將在Python 2.6上運行。

  • +0

    錯誤,'select()'可以佔第三項。假設每次輸入都會返回(繼續循環執行),您可以計算字符數,並停止或運行另一個「select()」調用。 –

    +0

    真的嗎?抱歉。我閱讀選擇的文檔,但我沒有注意到 –

    +0

    我應該給你提供一個簡單的例子還是你想嘗試一下嗎? :) –

    回答

    4

    好吧,我已經實現了它:D。

    #!/usr/bin/env python 
    
    import sys 
    from select import select 
    
    def main(argv): 
        timeout = 3 
        prompt = '> ' 
        max_chars = 3 
    
        # set raw input mode if relevant 
        # it is necessary to make stdin not wait for enter 
        try: 
         import tty, termios 
    
         prev_flags = termios.tcgetattr(sys.stdin.fileno()) 
         tty.setraw(sys.stdin.fileno()) 
        except ImportError: 
         prev_flags = None 
    
        buf = '' 
        sys.stderr.write(prompt) 
    
        while True: # main loop 
         rl, wl, xl = select([sys.stdin], [], [], timeout) 
         if rl: # some input 
          c = sys.stdin.read(1) 
          # you will probably want to add some special key support 
          # for example stop on enter: 
          if c == '\n': 
           break 
    
          buf += c 
          # auto-output is disabled as well, so you need to print it 
          sys.stderr.write(c) 
    
          # stop if N characters 
          if len(buf) >= max_chars: 
           break 
         else: 
          # timeout 
          break 
    
        # restore non-raw input 
        if prev_flags is not None: 
         termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, prev_flags) 
        # and print newline 
        sys.stderr.write('\n') 
    
        # now buf contains your input 
        # ... 
    
    if __name__ == "__main__": 
        main(sys.argv[1:]) 
    

    這是相當不完整的;我只是放了幾個值來測試它。解釋幾句:

    1. 您需要的TTY切換到「原始」模式 - 否則你將無法得到輸入沒有它通過回車鍵確診,
    2. 在原始模式類型化在字符中不再默認輸出 - 如果你想讓用戶看到自己正在輸入的內容,你需要自己輸出它們。
    3. 你可能想要處理像回車和退格鍵這樣的特殊鍵 - 我在這裏添加了輸入處理。也許你可以重新使用部分curses
    4. 我假設超時時間是'最後一個鍵後3秒'。如果你想整個過程超時,我認爲最簡單的方法是獲取當前時間,通過超時增加它(即得到end_time),然後通過end_time - current_time秒作爲超時到select(),
    5. 我已經使unix-具體進口可選。不過,我不知道它是否能夠正確地在Windows上工作。
    +0

    我實際上已經忘記提及我需要一種方法來隱藏用戶的輸入,但它看起來像您的原始模式對我來說是這樣,所以這一切都可以工作。非常感謝! –

    +0

    很高興幫助。雖然我不確定它們是否不在Windows中輸出,但如果這可能是相關的。 –

    +0

    沒關係。無論如何,這是純粹的Linux項目。 –

    相關問題