Maison > Article > développement back-end > Comment puis-je implémenter une entrée utilisateur limitée dans le temps en 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!