Maison >développement back-end >Tutoriel Python >Comment implémenter une limite de temps pour la saisie utilisateur en Python ?

Comment implémenter une limite de temps pour la saisie utilisateur en Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-16 17:42:031023parcourir

How to Implement a Time Limit for User Input in Python?

Comment implémenter une limite de temps pour la saisie utilisateur en Python

Lors de l'utilisation de la fonction raw_input(), vous pouvez rencontrer des situations dans lesquelles vous souhaitez pour terminer la saisie après une durée prédéfinie. Heureusement, Python propose plusieurs solutions pour répondre à cette exigence.

Méthode Unix uniquement :

La suggestion de @jer utilise la fonction signal.alarm, qui n'est disponible que sous Unix. systèmes. Cette fonction déclenche une exception KeyboardInterrupt lorsque le délai d'attente spécifié est atteint. Le code suivant illustre cette approche :

import signal

def raw_input_with_timeout(prompt, timeout):
    signal.alarm(timeout)
    try:
        return input(prompt)
    except KeyboardInterrupt:
        return None
    finally:
        signal.alarm(0)  # Reset alarm to avoid interference

Méthodes multiplateformes et spécifiques à Windows :

Pour les solutions multiplateformes ou spécifiques à Windows, envisagez d'utiliser le classe threading.Timer avec thread.interrupt_main. Cette approche envoie un KeyboardInterrupt au thread principal à partir d’un thread de minuterie. Le code ci-dessous illustre cette méthode :

import threading

def raw_input_with_timeout(prompt, timeout):
    print(prompt, end=' ')
    timer = threading.Timer(timeout, thread.interrupt_main)
    result = None
    try:
        timer.start()
        result = input(prompt)
    except KeyboardInterrupt:
        pass
    timer.cancel()
    return result

Méthode spécifique à Windows (non testée) :

Dans les environnements Windows, msvcrt peut être utilisé pour obtenir des délais d'attente. Cette approche implique d'interroger les pressions sur les touches dans une boucle étroite et d'accumuler les entrées jusqu'à ce qu'un temps maximum soit atteint ou qu'un caractère de nouvelle ligne soit détecté.

import msvcrt
import time

def raw_input_with_timeout(prompt, timeout):
    print(prompt, end=' ')
    finishat = time.time() + timeout
    result = []
    while True:
        if msvcrt.kbhit():
            result.append(msvcrt.getche())
            if result[-1] == '\r':
                return ''.join(result)
            time.sleep(0.1)
        else:
            if time.time() > finishat:
                return None

Comportement personnalisable :

Si une valeur de retour de délai d'attente autre que None est souhaitée, remplacez simplement l'instruction return None dans les extraits de code ci-dessus. De plus, l'ajustement de finishat après chaque frappe peut ajuster les délais d'attente en fonction du rythme de saisie.

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