Как задать вопрос, если заявление через тайм-аут - PullRequest
1 голос
/ 06 мая 2019

есть ли способ задать вопрос с помощью оператора if и через несколько секунд, если пользователь не дал никакого ответа, если штат использует ответ по умолчанию?

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

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

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

в этом случае, если пользователь не дает ответа через 30 секунд по умолчанию, если оператор выбирает номер 3

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Вот альтернативный способ сделать это (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)
0 голосов
/ 06 мая 2019
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 и, как таковой, также служит примером создания пользовательских потоков.

Таймеры запускаются, как и потоки, путем вызова их метода start ().Таймер можно остановить (до того, как его действие началось), вызвав метод cancel ().Интервал ожидания таймера перед выполнением его действия может не совпадать с интервалом, заданным пользователем.

Например:

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

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

class threading.Timer (интервал, функция, аргументы = нет, kwargs = нет)

Создайте таймер, который будет запускать функцию с аргументами args и ключевыми словами kwargs после того, как пройдут интервалы в секундах.Если args None (по умолчанию), то будет использоваться пустой список.Если kwargs - None (по умолчанию), то будет использоваться пустой dict.

cancel ()

Остановите таймер и отмените выполнение действия таймера.Это будет работать, только если таймер все еще находится на стадии ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...