【问题标题】:How to read a single key input with a timeout in python3?如何在python3中读取一个超时的单键输入?
【发布时间】:2021-09-22 01:23:27
【问题描述】:

这是我的尝试:

from inputimeout import inputimeout, TimeoutOccurred
import time
import sys
import os


def get_choice(maxtimeout=9):
    try:
        for remaining in range(maxtimeout, 0, -1):
            sys.stdout.write("\r")
            sys.stdout.write(
                "Want to continue to next item(Y/N)? Defaults to Y in {:2d} seconds...".format(
                    remaining + 1
                )
            )
            sys.stdout.flush()
            time.sleep(1)
        c = inputimeout(prompt="", timeout=1)
    except TimeoutOccurred:
        c = "Y"
    return c

我的方法的问题是:

  1. 在超时完成之前,输入的键不可见。
  2. 用户必须在选择后按回车键。
  3. 无论用户何时输入值,用户都必须等待超时完成。

【问题讨论】:

  • 您可以使用signal 模块设置一个计时器,如果用户在给定的时间内没有提供输入,则该计时器将关闭。如果您无法使其正常工作,我可以稍后提供示例。

标签: python python-3.x input


【解决方案1】:

这里有两个问题需要解决以满足您的首选要求。

首先,这里有一个简单的示例,说明如何使用信号计时器给用户一些时间来输入答案:

import signal

def input_timeout(*ignore):
    raise TimeoutError

signal.signal(signal.SIGALRM, input_timeout)
signal.setitimer(signal.ITIMER_REAL, 10)

try:
    inp = input("enter something: ")
    signal.setitimer(signal.ITIMER_REAL, 0)
except TimeoutError:
    print("you took too long!")

这样做的目的是将计时器设置为在 10 秒后关闭(如果需要,您可以使用小数时间,例如 2.5 秒)。如果用户在计时器关闭之前没有输入任何内容,则会引发TimeoutError 异常,从而中断输入提示。如果用户确实输入了某些内容,它会通过将计时器设置为零来禁用计时器。如果计时器触发并调用input_timeout(),它会传递两个参数(信号编号和中断的堆栈帧),但您通常可以忽略它们,所以我将这些参数设置为*ignore

这里有一个问题更详细地介绍了这种方法:Python timeout decorator。我之所以不只是向您指出这一点,是为了让您可以看到该过程的本质并自己决定如何使用它。另外,好吧,当我粘贴代码并尝试使用它时,它不起作用。您可以根据自己的需要决定如何进行。

第二个问题是您提到您的方法的问题是用户必须按 Enter。这是一个涵盖该主题的问题:raw_input in python without pressing enter。简而言之,没有一个简单的内置解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多