IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Ecrire un texte lettre à lettre


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2007
    Messages : 52
    Par défaut Ecrire un texte lettre à lettre
    Bonsoir à toutes et à tous,

    Je me demandais comment, en Python, il était possible d'écrire un texte lettre à lettre. J'ai essayé le code naïf suivant:

    import sys, time

    txt = "Bonjour les amis\n"
    for L in txt:
    sys.stdout.write(L)
    time.sleep(0.1)
    print

    Cette méthode qui semble très logique ne fonctionne pas. Il faut en fait attendre 0.1*len(txt) secondes pour que le message s'affiche tout simplement en entier. On en perd donc l'animation que nous recherchions.
    En fait, le problème provient du fait qu'on n'effectue pas le retour chariot, puisque si on le fait (avec, par exemple un simple print L), le temps en l'écriture de chaque lettre est correct, mais là, on perd la totale mise en forme que nous recherchions.
    J'ai aussi testé avec la méthode signal.alarm (même si le temps avant que l'alarme ne se déclenche ne peut être qu'un nombre entier de seconde, j'étais juste curieux de voir si ça marcherait) : CA NE MARCHE PAS.
    J'ai testé en lançant le run d'une classe, en me disant qu'un processus lancé en arrière plan pourrait peut-être faire l'affaire: CA NE MARCHE PAS.

    Quelqu'un aurait-il une idée ?

    Merci par avance,
    Mickaël

  2. #2
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Ajoute sys.stdout.flush() après ton write()

  3. #3
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    texte = "Bonjour les amis\n"
    for L in texte:
        sys.stdout.write(L)
        time.sleep(.1)
    Cela fonctionne très bien chez moi.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Tu dois être l'un des seuls chez qui ça fonctionne, à mon avis ça dépend de la gestion de la sortie standard, mais a priori en rajoutant le flush ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    texte = "Bonjour les amis\n"
    for L in texte:
        sys.stdout.write(L)
        sys.stdout.flush()
        time.sleep(.1)

  5. #5
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Tu dois être l'un des seuls chez qui ça fonctionne
    Quoi? exceptionnel?

    je suis sous winXP avec python 2.5.1, c'est plutôt banal, non?

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2007
    Messages : 52
    Par défaut
    Bonjour à tous,

    SUPER! Ca marche parfaitement.
    J'avais oublié de préciser que je travaillais sous un environnement UNIX en fait, sous une Suse plus précisemment.
    Je me doutais qu'il y avait un problème avec le buffer, mais je ne savais pas vraiment gérer ça...

    Quelqu'un pourrait-il me procurer une explication simple et claire sur le "pourquoi ça marche mieux avec la méthode flush" ? Qu'est ce qui empêchait le texte d'être écrit correctement avant, et qu'est ce que la méthode flush a fait exactement ?

    Encore merci,
    Mickaël

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Pour des raisons d'efficacité, la sortie standard est bufferisée (comment on dit en français ? tamponnée ? ) Ca veut dire que les écritures se font dans un tampon en mémoire et n'apparaisse à l'écran que quand le buffer est flushé. Cela permet de fusionner plusieurs opérations d'entrée/sortie (lentes) en une seule. Le flush est automatiquement effectué lors d'un retour de ligne (\n), si le buffer est plein, et sans doute dans quelques autres cas (si on fait une lecture sur l'entrée standard ou lorsque le processus se termine, sans doute).

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Pour compléter ce qu'a dit dividee, ce qui fait que selon la plate-forme utilisée ça fonctionne ou pas sans flush vient du fait que le tampon est géré différemment selon l'environnement utilisé. A priori les consoles Windows n'ont pas besoin de ce flush() alors que les terminaux UNIX, eux, en ont besoin pour afficher. Donc au final il vaut mieux ajouter cette ligne par souci de compatibilité.

Discussions similaires

  1. [XL-2007] Ecrire les nombres en lettres
    Par Gildas86 dans le forum Excel
    Réponses: 5
    Dernier message: 04/11/2009, 16h39
  2. [WD-2003] Ecrire des chiffres en lettres
    Par FCL31 dans le forum VBA Word
    Réponses: 10
    Dernier message: 23/10/2009, 08h51
  3. ecrire un chiffre en lettre
    Par intissar_g dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 06/08/2007, 13h25
  4. Fichier Texte et lettres accentuées
    Par lalles dans le forum Framework .NET
    Réponses: 3
    Dernier message: 29/03/2007, 13h50
  5. texte défilant lettre à lettre !
    Par artotal dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/01/2006, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo