首頁 >後端開發 >Python教學 >如何在 Python 中實現有時限的使用者輸入?

如何在 Python 中實現有時限的使用者輸入?

Susan Sarandon
Susan Sarandon原創
2024-11-27 07:43:16420瀏覽

How Can I Implement Time-Bound User Input in Python?

有時限的使用者輸入:探索解決方案

在動態的程式設計世界中,通常有必要對使用者輸入施加時間限制。考慮這樣的場景:您想要向使用者提出問題並限制他們必須回答的時間。在 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中文網其他相關文章!

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