如何在 Python 中实现用户输入的时间限制
在使用 raw_input() 函数时,您可能会遇到您希望的情况在预定义的持续时间后终止输入。幸运的是,Python 提供了多种解决方案来满足此要求。
Unix 专用方法:
@jer 的建议利用 signal.alarm 函数,该函数仅在 Unix 上可用系统。当达到指定的超时时,此函数将引发 KeyboardInterrupt 异常。以下代码举例说明了此方法:
import signal def raw_input_with_timeout(prompt, timeout): signal.alarm(timeout) try: return input(prompt) except KeyboardInterrupt: return None finally: signal.alarm(0) # Reset alarm to avoid interference
跨平台和特定于 Windows 的方法:
对于跨平台或特定于 Windows 的解决方案,请考虑使用threading.Timer 类以及 thread.interrupt_main。此方法从计时器线程向主线程发送键盘中断。下面的代码说明了此方法:
import threading def raw_input_with_timeout(prompt, timeout): print(prompt, end=' ') timer = threading.Timer(timeout, thread.interrupt_main) result = None try: timer.start() result = input(prompt) except KeyboardInterrupt: pass timer.cancel() return result
Windows 特定方法(未经测试):
在 Windows 环境中,可以使用 msvcrt 来实现超时。此方法涉及在紧密循环内轮询按键并累积输入,直到达到最大时间或检测到换行符。
import msvcrt import time def raw_input_with_timeout(prompt, timeout): print(prompt, end=' ') finishat = time.time() + timeout result = [] while True: if msvcrt.kbhit(): result.append(msvcrt.getche()) if result[-1] == '\r': return ''.join(result) time.sleep(0.1) else: if time.time() > finishat: return None
可自定义行为:
如果需要 None 以外的超时返回值,只需替换上述代码片段中的 return None 语句即可。此外,在每次击键后调整 finishat 可以根据输入节奏调整超时。
以上是如何在Python中实现用户输入的时间限制?的详细内容。更多信息请关注PHP中文网其他相关文章!