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
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!