103 votes

Entrée au clavier avec délai d'attente?

Comment demanderiez-vous à l'utilisateur de saisir des données mais en arrêtant après N secondes ?

Google pointe vers un fil de discussion par e-mail à ce sujet sur http://mail.python.org/pipermail/python-list/2006-January/533215.html mais cela ne semble pas fonctionner. Peu importe la déclaration dans laquelle le délai d'attente se produit, que ce soit un sys.input.readline ou un timer.sleep(), j'obtiens toujours :

: [raw_]input expected at most 1 arguments, got 2

ce que sauf erreur ne parvient pas à capturer.

0voto

Hans Points 19

J'ai rencontré le même problème et je l'ai résolu avec le clavier et kthread. Dès que vous appuyez sur Entrée, le champ de saisie disparaît. C'était la chose la plus importante pour moi, mais je n'ai pas réussi à le faire fonctionner avec d'autres méthodes.

Si vous le souhaitez, vous pouvez l'installer en utilisant pip :

pip install input-timeout

Voici quelques exemples :

        from input_timeout import InputTimeout

        i = InputTimeout(

            timeout=20,

            input_message=" >> ",

            timeout_message="'Désolé, vous n'avez pas été assez rapide'",

            defaultvalue="lent",

            cancelbutton="esc",

            show_special_characters_warning='Si vous voulez utiliser des caractères spéciaux, vous devez utiliser alt+\\d\\d\\d\\d\nAppuyez sur "ctrl" pour voir une liste complète de toutes les combinaisons!',

        ).finalvalue

        print(f"\n\nVotre saisie était {i}")

        i = InputTimeout(

            timeout=5,

            input_message=" >> ",

            timeout_message="Désolé, vous n'avez pas été assez rapide : ",

            defaultvalue="lent",

            cancelbutton="esc",

            show_special_characters_warning='Si vous voulez utiliser des caractères spéciaux, vous devez utiliser alt+\\d\\d\\d\\d\nAppuyez sur "ctrl" pour voir une liste complète de toutes les combinaisons!',

        ).finalvalue

        print(f"\n\nVotre saisie était {i}")

        i = InputTimeout(

            timeout=10,

            input_message=" >> ",

            timeout_message="Désolé, vous n'avez pas été assez rapide",

            defaultvalue="Réveille-toi!",

            cancelbutton=None,

            show_special_characters_warning=None,

        ).finalvalue

        print(f"\n\nVotre saisie était {i}")

        i = InputTimeout(

            timeout=10,

            input_message=" >> ",

            timeout_message="Désolé, vous n'avez pas été assez rapide",

            defaultvalue="Tu dors?",

            cancelbutton="esc",

            show_special_characters_warning=None,

        ).finalvalue

        print(f"\n\nVotre saisie était {i}")

        i = InputTimeout(

            timeout=10,

            input_message=" >>",

            timeout_message="Désolé, vous n'avez pas été assez rapide",

            defaultvalue="vous êtes tellement lent",

            cancelbutton=None,

            show_special_characters_warning='Si vous voulez utiliser des caractères spéciaux, vous devez utiliser alt+\\d\\d\\d\\d\nAppuyez sur "ctrl" pour voir une liste complète de toutes les combinaisons!',

        ).finalvalue

        print(f"\n\nVotre saisie était {i}")

#output

Si vous voulez utiliser des caractères spéciaux, vous devez utiliser alt+\d\d\d\d

Appuyez sur "ctrl" pour voir une liste complète de toutes les combinaisons!

 >>  babba

Votre saisie était babba

Si vous voulez utiliser des caractères spéciaux, vous devez utiliser alt+\d\d\d\d

Appuyez sur "ctrl" pour voir une liste complète de toutes les combinaisons!

alt+0192    ->  À       alt+0193    ->  Á       alt+0196    ->  Ä       alt+0194    ->  Â       

alt+0195    ->  Ã       alt+0197    ->  Å       alt+0198    ->  Æ       alt+0228    ->  ä       

alt+0224    ->  à       alt+0225    ->  á       alt+0226    ->  â       alt+0227    ->  ã       

alt+0229    ->  å       alt+0230    ->  æ       alt+0199    ->  Ç       alt+0231    ->  ç       

alt+0208    ->  Ð       alt+0240    ->  ð       alt+0203    ->  Ë       alt+0200    ->  È       

alt+0201    ->  É       alt+0202    ->  Ê       alt+0235    ->  ë       alt+0232    ->  è       

alt+0233    ->  é       alt+0234    ->  ê       alt+0207    ->  Ï       alt+0204    ->  Ì       

alt+0205    ->  Í       alt+0206    ->  Î       alt+0239    ->  ï       alt+0236    ->  ì       

alt+0237    ->  í       alt+0238    ->  î       alt+0209    ->  Ñ       alt+0241    ->  ñ       

alt+0214    ->  Ö       alt+0210    ->  Ò       alt+0211    ->  Ó       alt+0212    ->  Ô       

alt+0213    ->  Õ       alt+0216    ->  Ø       alt+0140    ->  Œ       alt+0246    ->  ö       

alt+0242    ->  ò       alt+0243    ->  ó       alt+0244    ->  ô       alt+0245    ->  õ       

alt+0248    ->  ø       alt+0156    ->  œ       alt+0138    ->  Š       alt+0223    ->  ß       

alt+0154    ->  š       alt+0222    ->  Þ       alt+0254    ->  þ       alt+0220    ->  Ü       

alt+0217    ->  Ù       alt+0218    ->  Ú       alt+0219    ->  Û       alt+0252    ->  ü       

alt+0249    ->  ù       alt+0250    ->  ú       alt+0251    ->  û       alt+0159    ->  Ÿ       

alt+0221    ->  Ý       alt+0255    ->  ÿ       alt+0253    ->  ý       alt+0168    ->  ¨       

alt+0136    ->  ˆ       alt+0180    ->  ´       alt+0175    ->  ¯       alt+0184    ->  ¸       

alt+0192    ->  À       alt+0193    ->  Á       alt+0196    ->  Ä       alt+0194    ->  Â       

alt+0195    ->  Ã       alt+0197    ->  Å       alt+0198    ->  Æ       alt+0228    ->  ä       

alt+0224    ->  à       alt+0225    ->  á       alt+0226    ->  â       alt+0227    ->  ã       

alt+0229    ->  å       alt+0230    ->  æ       alt+0199    ->  Ç       alt+0231    ->  ç       

alt+0208    ->  Ð       alt+0240    ->  ð       alt+0203    ->  Ë       alt+0200    ->  È       

alt+0201    ->  É       alt+0202    ->  Ê       alt+0235    ->  ë       alt+0232    ->  è       

alt+0233    ->  é       alt+0234    ->  ê       alt+0207    ->  Ï       alt+0204    ->  Ì       

alt+0205    ->  Í       alt+0206    ->  Î       alt+0239    ->  ï       alt+0236    ->  ì       

alt+0237    ->  í       alt+0238    ->  î       alt+0209    ->  Ñ       alt+0241    ->  ñ       

alt+0214    ->  Ö       alt+0210    ->  Ò       alt+0211    ->  Ó       alt+0212    ->  Ô       

alt+0213    ->  Õ       alt+0216    ->  Ø       alt+0140    ->  Œ       alt+0246    ->  ö       

alt+0242    ->  ò       alt+0243    ->  ó       alt+0244    ->  ô       alt+0245    ->  õ       

alt+0248    ->  ø       alt+0156    ->  œ       alt+0138    ->  Š       alt+0223    ->  ß       

alt+0154    ->  š       alt+0222    ->  Þ       alt+0254    ->  þ       alt+0220    ->  Ü       

alt+0217    ->  Ù       alt+0218    ->  Ú       alt+0219    ->  Û       alt+0252    ->  ü       

alt+0249    ->  ù       alt+0250    ->  ú       alt+0251    ->  û       alt+0159    ->  Ÿ       

alt+0221    ->  Ý       alt+0255    ->  ÿ       alt+0253    ->  ý       alt+0168    ->  ¨       

alt+0136    ->  ˆ       alt+0180    ->  ´       alt+0175    ->  ¯       alt+0184    ->  ¸       

Désolé, vous n'avez pas été assez rapide : 

Votre saisie était lente

 >>  super

Votre saisie était super

 >>  adasa

Votre saisie était adasa

Si vous voulez utiliser des caractères spéciaux, vous devez utiliser alt+\d\d\d\d

Appuyez sur "ctrl" pour voir une liste complète de toutes les combinaisons!

Désolé, vous n'avez pas été assez rapide

Votre saisie était vous êtes tellement lent

0voto

Steve HHH Points 3088

En novembre 2022, il y a un projet pour Python 3 par werecatf dans le dépôt pypi appelé pytimedinput. Il fonctionne bien sur mon système Windows 10. Vous pouvez l'installer avec pip comme ceci :

C:\Users\User> pip install pytimedinput

Voici un exemple d'utilisation :

from pytimedinput import timedInput
userText, timedOut = timedInput("Entrez quelque chose : ", timeout=5)
if(timedOut):
    print("Délai dépassé lors de l'attente de l'entrée.")
    print(f"Entrée de l'utilisateur jusqu'à présent : '{userText}'")
else:
    print(f"Entrée de l'utilisateur : '{userText}'")

0voto

kazemakase Points 2505

Il est possible de faire cela avec asyncio. Essentiellement en combinant https://stackoverflow.com/a/65909044/3005167 et https://stackoverflow.com/a/54787498/3005167 mène à quelque chose comme ceci:

import asyncio
import sys

async def main():
    reader = asyncio.StreamReader()
    pipe = sys.stdin
    loop = asyncio.get_event_loop()
    await loop.connect_read_pipe(lambda: asyncio.StreamReaderProtocol(reader), pipe)

    got_input = None

    async def get_input():
        nonlocal got_input
        inp = await anext(aiter(reader))
        got_input = inp.decode()

    tasks = [asyncio.create_task(asyncio.sleep(5)), asyncio.create_task(get_input())]

    await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)

    if got_input is None:
        print("Temps écoulé!")
    else:
        print("Entrée: ", got_input)

if __name__ == "__main__":
    asyncio.run(main())

-3voto

try Points 1

Une réponse tardive :)

Je ferais quelque chose comme ça :

from time import sleep

print('Veuillez fournir une entrée dans 20 secondes! (Appuyez sur Ctrl-C pour commencer)')
try:
    for i in range(0,20):
        sleep(1) # could use a backward counter to be preeety :)
    print('Aucune entrée n\'est donnée.')
except KeyboardInterrupt:
    raw_input('Entrée x:')
    print('Toi, toi ! Tu sais quelque chose.')

Je sais que ce n'est pas la même chose mais de nombreux problèmes de la vie réelle pourraient être résolus de cette manière. (J'ai généralement besoin d'une limite de temps pour l'entrée de l'utilisateur lorsque je veux que quelque chose continue à s'exécuter si l'utilisateur n'est pas là en ce moment.)

J'espère que cela aide au moins partiellement. (Si quelqu'un le lit de toute façon :) )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X