2013-01-14 33 views
1

我想在終端上獲得輸入,並只給出幾秒鐘的響應。當達到超時時,我想閱讀在接受中輸入的內容作爲給定的輸入。或者,我希望用戶能夠按「回車」提前提交答案。Unix Python - 獲取終端輸入,不需要按下輸入超時後

我有下面的代碼工作正常,但要求用戶按「輸入」提交。它有一個錯誤:輸入文本,然後等待超時將文本保留在「緩衝區」中。然後當你再次提示你輸入不同的文本時,按回車鍵,然後打印兩個字符串(見輸出)。當超時達到時,我想接受任何被輸入爲「答案」的內容。我希望用戶仍然可以通過按「enter」鍵更快地提交答案。

有沒有辦法達到理想的行爲?

注:我使用的是Mac OS X

import sys 
from select import select 

def getResponse(timeout): 
    print "Enter something:" 
    rlist, wlist, xlist = select([sys.stdin], [], [], timeout) 
    if rlist: 
     result = sys.stdin.readline() 
     return result 
    else: 
     return '' 

while True: 
    response = getResponse(3) 
    print "Your input is:", response 

輸出:

Enter something: 
pythonYour input is: 
Enter something: 
dangit 
Your input is: pythondangit 
+0

我不相信使用終端有任何簡單的答案。我可以看到這是用ncurses完成的,但這可能會引入一千個不同的問題。 – mmgp

回答

2

你想從一個非blockin閱讀終端用戶輸入克的方式,也可以超時閱讀,然後得到沒有按下輸入的內容。至少這是有問題的,但這不會是一個簡單的答案。作爲一個起點,你可以考慮使用下面的ncurses代碼。用戶最好不要刪除他的輸入!可以調整代碼以處理字符刪除以及許多其他「花哨」功能,最終可能會以迷你終端結束。

你所要求的通常是使用事件循環完成的,包括讀取部分(其中raw_input是一個不錯的選擇)。一個GUI工具包可以更容易地解決這個問題,並且更加強大(但當然它的後面有幾千行)。

import time 
import curses 

ENTER_KEY = (curses.KEY_ENTER, ord('\n'), ord('\r')) 

def run(win, timeout=3): # timeout in seconds 
    curses.echo() 
    win.timeout(0) # Non-block read. 

    line = 0 
    while True: 
     win.addstr(line, 0, "Enter something: ") 
     s = [] 
     start = time.time() 
     run = True 
     while run: 
      c = win.getch() 
      time_taken = time.time() - start 

      if c < 0: 
       pass 
      elif c in ENTER_KEY: 
       break 
      else: 
       s.append(chr(c)) 

      if time_taken >= timeout: 
       # Out of time. 
       s.append(-1) 
       run = False 

     if len(s) == 0: 
      break 
     if s[-1] == -1: 
      s.pop() 
     answer = ''.join(s) 
     win.addstr(line + 1, 0, "Your input was: %s" % answer) 
     line += 2 

curses.wrapper(run) 

要優雅地按下輸入而不輸入任何內容。如果時間用完,它會繼續詢問輸入。我根本沒有測試這個代碼,我只知道它有很多限制。

+0

使用GUI的建議是一個很好的建議。這不是控制檯行爲。在控制檯上編寫全雙工終端的工作需要在每個操作系統上重複進行。 –

+0

這是完美的!正是我所需要的!也感謝對​​詛咒的點頭。我懷疑我可以使用這個庫獲得結果,但我不知道從哪裏開始。 – NTUI

0

這是不正常的控制檯行爲,但這裏是一個討論的幾個選項後:

Keyboard input with timeout in Python

+1

對 - 我看到了,我正在使用select,但這不是所需的行爲。 – NTUI

+0

期望的行爲是什麼? –

+0

「我想在終端上獲得輸入信息,並且只給出幾秒鐘的響應時間。當超時達到時,我想要閱讀接受的輸入內容,也可以是給定的輸入。用戶能夠按「回車」提前回答他們的答案。「 – NTUI