Maison >développement back-end >Tutoriel Python >Comment puis-je implémenter une contribution utilisateur limitée dans le temps dans la programmation ?

Comment puis-je implémenter une contribution utilisateur limitée dans le temps dans la programmation ?

DDD
DDDoriginal
2024-11-26 17:22:13680parcourir

How Can I Implement Time-Limited User Input in Programming?

Saisie avec restriction de temps

En programmation, il peut être avantageux d'imposer une limite de temps à la saisie de l'utilisateur. Par exemple, vous souhaiterez peut-être poser une question aux utilisateurs et leur accorder une durée limitée pour répondre, par exemple :

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

Si l'utilisateur dépasse le délai imparti, vous pouvez afficher un message du type :

print('Sorry, times up.')

Solutions pour une saisie limitée dans le temps

Pour mettre en œuvre une saisie limitée dans le temps, considérez ces options :

  • Blocage du thread principal : S'il est acceptable de bloquer l'exécution de votre code pendant que l'utilisateur fournit une entrée, vous pouvez utiliser un objet Timer :
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()
  • Entrée non bloquante (Windows) : Pour éviter de bloquer le thread principal, vous peut utiliser la méthode suivante sous Windows (notez que cette approche n'est pas testée) :
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] == '\r':
                return ''.join(result[:-1])
        time.sleep(0.04)  # just to yield to other processes/threads
    raise TimeoutExpired
  • Entrée non bloquante (Unix) : Alternativement, sous Unix -systèmes basés sur les systèmes, vous pouvez utiliser l'une des approches suivantes :
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

En mettant en œuvre ces méthodes, vous pouvez appliquer efficacement restrictions de temps pour la saisie de l'utilisateur, améliorant l'expérience utilisateur et contrôlant le flux de votre programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn