1

ターミナルで入力を取得し、応答するのに数秒だけ与えたいです。タイムアウトに達したら、入力されたものをすべて読み取り、指定された入力として受け入れたいと思います。オプションで、ユーザーが「Enter」を押して回答を早めに送信できるようにしたいと考えています。

以下のコードは問題なく動作しますが、送信するにはユーザーが「Enter」を押す必要があります。バグがあります: テキストを入力してからタイムアウトを待つと、テキストが「バッファ」に保持されます。次に、プロンプトが再度表示されたら、別のテキストを入力し、Enter キーを押すと、両方の文字列が出力されます (出力を参照)。タイムアウトに達したら、入力されたものを「回答」として受け入れたいと思います。「Enter」を押すことで、ユーザーが回答をより速く送信できるようにしたいと思います。

目的の動作を実現する方法はありますか?

注: Mac OS X を使用しています

import sys
from select import select

def getResponse(timeout):
   print "Enter something:"
   rlist, wlist, xlist = select([sys.stdin], [], [], timeout)
   if rlist:
      result = sys.stdin.readline()
      return result
   else:
      return ''

while True:
   response = getResponse(3)
   print "Your input is:", response

出力:

Enter something:
pythonYour input is: 
Enter something:
dangit
Your input is: pythondangit
4

2 に答える 2

2

ターミナルからのユーザー入力を非ブロッキング方式で読み取り、読み取りをタイムアウトして、Enterキーを押すことなく書き込まれたものを取得できるようにする必要があります。それは少なくとも問題があります、それに対する簡単な答えはありません。出発点として、次のncursesコードの使用を検討してください。ユーザーは入力を消去する必要がない方がよいでしょう。コードは、文字の削除や他の多くの「派手な」機能を処理するように調整でき、最終的にはミニターミナルで終わる可能性があります。

要求していることは、通常、読み取り部分(raw_inputが不適切な選択)を含むイベントループを使用して行われます。GUIツールキットはそれをより簡単にそしてより頑強に解決することができます(しかしもちろんそれはその後ろに数千行あります)。

import time
import curses

ENTER_KEY = (curses.KEY_ENTER, ord('\n'), ord('\r'))

def run(win, timeout=3): # timeout in seconds
    curses.echo()
    win.timeout(0) # Non-block read.

    line = 0
    while True:
        win.addstr(line, 0, "Enter something: ")
        s = []
        start = time.time()
        run = True
        while run:
            c = win.getch()
            time_taken = time.time() - start

            if c < 0:
                pass
            elif c in ENTER_KEY:
                break
            else:
                s.append(chr(c))

            if time_taken >= timeout:
                # Out of time.
                s.append(-1)
                run = False

        if len(s) == 0:
            break
        if s[-1] == -1:
            s.pop()
        answer = ''.join(s)
        win.addstr(line + 1, 0, "Your input was: %s" % answer)
        line += 2

curses.wrapper(run)

正常に終了するには、何も入力せずにEnterキーを押します。時間がなくなると、入力を求め続けます。私はこのコードをまったくテストしませんでした、私はその多くの制限を知っているだけです。

于 2013-01-14T04:01:35.357 に答える
0

これは通常のコンソールの動作ではありませんが、いくつかのオプションについて説明している投稿を次に示します。

Python でのタイムアウトを伴うキーボード入力

于 2013-01-14T01:52:47.453 に答える