Maison  >  Article  >  développement back-end  >  Comment puis-je implémenter une entrée utilisateur limitée dans le temps en Python ?

Comment puis-je implémenter une entrée utilisateur limitée dans le temps en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-27 07:43:16400parcourir

How Can I Implement Time-Bound User Input in Python?

Entrée utilisateur limitée dans le temps : exploration de solutions

Dans le monde dynamique de la programmation, il devient souvent nécessaire d'imposer des contraintes de temps à l'entrée utilisateur . Considérez le scénario dans lequel vous souhaitez présenter une question à un utilisateur et limiter le temps dont il dispose pour répondre. Réaliser cette tâche en Python peut sembler simple, mais elle introduit son propre ensemble de défis.

Une approche consiste à utiliser le module threading. En créant un objet Timer et en définissant sa durée, vous pouvez lancer un compte à rebours. Pendant cette période, le code reste bloqué, en attente de la saisie de l'utilisateur. Si le délai expire avant qu'une réponse ne soit reçue, un message approprié peut être affiché. L'extrait de code ci-dessous illustre cette approche :

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()

Cependant, cette méthode a ses limites. Le blocage du thread principal peut empêcher l'exécution d'autres tâches au sein du programme. Ainsi, des approches alternatives permettant un fonctionnement non bloquant deviennent nécessaires.

Solutions spécifiques au système d'exploitation

Pour les systèmes Windows, vous pouvez tirer parti du msvcrt module, qui fournit une interface de bas niveau pour la saisie au clavier. L'exception TimeoutExpired est levée si le délai spécifié est dépassé, vous permettant de gérer la situation en conséquence. Voici une implémentation :

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

Améliorations basées sur Unix

Sur les systèmes de type Unix, vous pouvez explorer le module select. Il vous permet de surveiller les descripteurs de fichiers et d'attendre des événements spécifiés, y compris la saisie au clavier dans un laps de temps donné. L'extrait de code suivant illustre cette technique :

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

Vous pouvez également utiliser le module signal. En réglant une minuterie et en gérant le signal SIGALRM résultant, vous pouvez imposer une contrainte de temps sur la saisie de l'utilisateur. Voici comment procéder :

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

Ces approches offrent des alternatives non bloquantes pour limiter le temps de saisie de l'utilisateur, offrant ainsi plus de flexibilité et de contrôle au sein de vos programmes Python.

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