Python でユーザー入力の時間制限を実装する方法
raw_input() 関数の使用中に、必要な状況が発生する可能性があります。事前定義された期間の経過後に入力を終了します。幸いなことに、Python はこの要件に対処するためのソリューションをいくつか提供しています。
Unix のみの方法:
@jer の提案では、Unix でのみ利用できる signal.alarm 関数を利用します。システム。この関数は、指定されたタイムアウトに達すると、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。このアプローチでは、タイマー スレッドからメイン スレッドに KeyboardInterrupt を送信します。以下のコードは、このメソッドを示しています。
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 ステートメントを単純に置き換えます。さらに、各キーストロークの後に終了を調整すると、入力ペーシングに基づいてタイムアウトを調整できます。
以上がPython でユーザー入力の時間制限を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。