有時限的使用者輸入:探索解決方案
在動態的程式設計世界中,通常有必要對使用者輸入施加時間限制。考慮這樣的場景:您想要向使用者提出問題並限制他們必須回答的時間。在 Python 中實現此任務可能看起來很簡單,但它也帶來了一系列挑戰。
一種方法涉及利用 執行緒 模組。透過建立 Timer 物件並設定其持續時間,您可以啟動倒數計時。在此期間,代碼保持阻塞狀態,等待使用者輸入。如果在收到回應之前時間到期,則可以顯示適當的訊息。下面的程式碼片段示範了這種方法:
from threading import Timer timeout = 10 t = Timer(timeout, print, ['Sorry, times up']) t.start() prompt = "You have %d seconds to choose the correct answer...\n" % timeout answer = input(prompt) t.cancel()
但是,這種方法有其限制。阻塞主執行緒可能會阻礙程式中其他任務的執行。因此,允許非阻塞操作的替代方法變得必要。
特定於作業系統的解決方案
對於 Windows 系統,您可以利用 msvcrt 模組,為鍵盤輸入提供低階介面。如果超過指定的時間限制,則會引發 TimeoutExpired 異常,以便您能夠相應地處理情況。這是一個實作:
import msvcrt import time class TimeoutExpired(Exception): pass def input_with_timeout(prompt, timeout, timer=time.monotonic): sys.stdout.write(prompt) sys.stdout.flush() endtime = timer() + timeout result = [] while timer() < endtime: if msvcrt.kbhit(): result.append(msvcrt.getwche()) #XXX can it block on multibyte characters? if result[-1] == '\r': return ''.join(result[:-1]) time.sleep(0.04) # just to yield to other processes/threads raise TimeoutExpired
基於 Unix 的增強
在類 Unix 系統上,您可以探索 select 模組。它允許您監視檔案描述符並等待指定的事件,包括給定時間範圍內的鍵盤輸入。以下程式碼片段舉例說明了此技術:
import select import sys def input_with_timeout(prompt, timeout): sys.stdout.write(prompt) sys.stdout.flush() ready, _, _ = select.select([sys.stdin], [],[], timeout) if ready: return sys.stdin.readline().rstrip('\n') # expect stdin to be line-buffered raise TimeoutExpired
或者,您可以使用 signal 模組。透過設定計時器並處理產生的 SIGALRM 訊號,您可以對使用者輸入施加時間限制。操作方法如下:
import signal def alarm_handler(signum, frame): raise TimeoutExpired def input_with_timeout(prompt, timeout): # set signal handler signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(timeout) # produce SIGALRM in `timeout` seconds try: return input(prompt) finally: signal.alarm(0) # cancel alarm
這些方法為限制使用者輸入的時間提供了非阻塞替代方案,在 Python 程式中提供了更大的靈活性和控制力。
以上是如何在 Python 中實現有時限的使用者輸入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!