有時間限制的輸入
在程式設計中,對使用者輸入施加時間限制是有益的。例如,您可能希望向使用者詢問問題並為他們提供有限的回應時間,例如:
print('some scenario') prompt = input("You have 10 seconds to choose the correct answer...\n")
如果使用者超過時間限制,您可以顯示類似以下的訊息:
print('Sorry, times up.')
限時輸入解決方案
實現限時輸入,考慮以下選項:
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()阻止主執行緒:
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
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
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非阻塞輸入(Windows)
:為避免阻塞主線程,可以在Windows 上使用以下方法(注意此方法未經測試):
非阻塞輸入(Unix):或者,在基於Unix 的系統上,您可以使用以下其中一種方法:透過實作這些方法,您可以有效地對使用者輸入應用時間限制,增強使用者體驗並控製程式流程。以上是如何在程式設計中實現限時用戶輸入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!