如何通过if语句通过超时提问

时间:2019-05-06 17:21:39

标签: python if-statement

有什么方法可以通过if语句来询问问题,以及在几秒钟后如果用户没有给出任何答案,或者状态是否使用默认答案?

inp = input("change music(1) or close the app(2)")

if inp = '1':
    print("Music changed)

elif inp = '2':
    print("good by")

在这种情况下,如果语句默认选择3,则用户默认在30秒后不给出任何答案

2 个答案:

答案 0 :(得分:0)

from threading import Timer

out_of_time = False

def time_ran_out():
    print ('You didn\'t answer in time') # Default answer
    out_of_time = True

seconds = 5 # waiting time in seconds
t = Timer(seconds,time_ran_out)
t.start()
inp = input("change music(1) or close the app(2):\n")

if inp != None and not out_of_time:
     if inp == '1':
          print("Music changed")
     elif inp == '2':
          print("good by")
     else:
          print ("Wrong input")
     t.cancel()
  

计时器对象

     

此类表示仅在经过一定时间(计时器)后才应执行的操作。计时器是一个   Thread的子类,因此也可以作为Thread的示例   创建自定义线程。

     

与线程一样,通过调用其start()方法来启动计时器。   可以通过调用计时器来停止计时器(在其动作开始之前)   cancel()方法。计时器在执行之前等待的间隔   动作可能与设定的时间间隔不完全相同   用户。

     

例如:

def hello():
    print("hello, world")

t = Timer(30.0, hello)
t.start()  # after 30 seconds, "hello, world" will be printed
     

类线程。计时器(间隔,函数,args = None,kwargs = None)

     

创建一个计时器,该计时器将使用参数args和关键字运行函数   在间隔秒过去之后,参数kwargs。如果args为None   (默认),然后将使用一个空列表。如果kwargs为None(   默认),那么将使用一个空字典。

     

cancel()

     

停止计时器,并取消执行计时器的操作。仅当计时器仍在等待时,这才有效   阶段。

答案 1 :(得分:0)

这是使用多重处理的另一种方法(python 3)。请注意,要使stdin在子进程中正常工作,必须先重新打开它。我还将输入的内容从字符串转换为int以便与多处理值一起使用,因此您可能也要在此处进行错误检查。

import multiprocessing as mp
import time
import sys
import os


TIMEOUT = 10
DEFAULT = 3


def get_input(resp: mp.Value, fn):
    sys.stdin = os.fdopen(fn)
    v = input('change music(1) or close the app (2)')
    try:
        resp.value = int(v)
    except ValueError:
        pass # bad input, maybe print error message, try again in loop.
        # could also use another mp.Value to signal main to restart the timer


if __name__ == '__main__':

    now = time.time()
    end = now + TIMEOUT

    inp = 0
    resp = mp.Value('i', 0)
    fn = sys.stdin.fileno()
    p = mp.Process(name='Get Input', target=get_input, args=(resp, fn))
    p.start()

    while True:
        t = end - time.time()
        print('Checking for timeout: Time = {:.2f}, Resp = {}'.format(t, resp.value))

        if t <= 0:
            print('Timeout occurred')
            p.terminate()
            inp = DEFAULT
            break
        elif resp.value > 0:
            print('Response received:', resp.value)
            inp = resp.value
            break
        else:
            time.sleep(1)

    print()
    if inp == 1:
        print('Music Changed')
    elif inp == 2:
        print('Good Bye')
    else:
        print('Other value:', inp)