2013-03-20 6 views
5

私ができることを望むのは、入力を使ってユーザーに質問することです。たとえば、次のようにPython 3 Timed Input

print('some scenario') 
prompt = input("You have 10 seconds to choose the correct answer...\n") 

、時間が経過する

print('Sorry, times up.') 

のようなものを印刷するならば、正しい方向に私を指している任意の助けいただければ幸いです。

+0

@interjayを。まず第一に、UnixではなくWindowsプラットフォームです。受け入れられた答えはそれがUnixだけだと言います、そして、私はそれは後でそれが働いていないと答えた人が信じています。また、私はPython 3で作業しています。私はraw_inputではなくinputを使う必要があります。 – cloud311

+3

この質問とFrancesco Frassinelliが投稿した質問には複数の回答があり、その多くはUnix専用ではありません。そして、単に 'raw_input'を' input'に変更することができます。 BTW質問をするときは、Windowsで実行するなどの関連情報を指定する必要があります。また、試したが解決しなかったソリューションを使用して、古い回答を書き換える時間を無駄にしないようにします。 – interjay

+1

[キーボード入力とタイムアウトのPython](http://stackoverflow.com/q/1335507/4279) – jfs

答えて

3

興味深い問題、これは動作しているようです:

import time 
from threading import Thread 

answer = None 

def check(): 
    time.sleep(2) 
    if answer != None: 
     return 
    print "Too Slow" 

Thread(target = check).start() 

answer = raw_input("Input something: ") 
+3

あなたは[ 'Thread' +' time.sleep'の代わりに 'threading.Timer'を使います](http://stackoverflow.com/a/15533404/4279)。 Python 3にはraw_inputはありません。 – jfs

+3

mainthreadでraw_input()はどのように終了しますか?私はスレッドチェック()がどのように終了し、 "ゆっくり"標準出力にプッシュするかを見ます。しかし、raw_input()がstdinバッファをいっぱいにしたり、 "完了"する方法はありません。 – DevPlayer

8

ユーザーが答えていない場合は、メインスレッドをブロックするために許容可能である場合:それ以外の場合は

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() 

を、あなたが使用することができ@Alex Martelli's answer (テストされていない)Windows(テストされていない)上の(Python 3用に修正された):

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] == '\n': #XXX check what Windows returns here 
       return ''.join(result[:-1]) 
     time.sleep(0.04) # just to yield to other processes/threads 
    raise TimeoutExpired 

使用法: Unixでは

try: 
    answer = input_with_timeout(prompt, 10) 
except TimeoutExpired: 
    print('Sorry, times up') 
else: 
    print('Got %r' % answer) 

あなたは試みることができる:

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 
+1

最初の応答はタイムアウトの後に印刷されましたが、入力はまだ利用可能でした。 –

+1

@EliezerMiron:はい、 'input()'呼び出しは、最初の例では中断されていません。*例の前に* "メインスレッドをブロックすることができれば" *。あなたが入力をinterrtuptする必要があるなら、 'input_with_timeout()'で以下の例を使用してください。 – jfs

+0

私は 'import signal 'を使ってみましたが、そのタイミング感覚は途切れているようです。私はCloud9 IDEを使用しています。 .5タイムアウトを設定すると、タイムアウトするまでに約3秒間待機します。 –

関連する問題