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 :

Comment afficher des données avec tk en temps réel et non en fin de traitement [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut Comment afficher des données avec tk en temps réel et non en fin de traitement
    Bonjour,
    Je suis sous W10, Python 35 et j'utilise tkinter pour gérer des fenetres d'affichage.

    Je crée des fenêtres et effectue des traitements sur des données. Selon le type de la donnée traitée, je l'affichage dans la fenêtre appropriée.

    Je crée une fenêtre avec les commandes :
    1 fenetre1 = Tk()
    2 fenetre1.title("Fenêtre 1")
    3 champ_label1 = Label(fenetre1, text="Lancement du programme")
    4 champ_label1.pack(side="top")
    5 texte1 = ScrolledText(fenetre1, width = 75, height = 35, font = "Arial 10",relief = "groove")
    6 texte1.pack()

    Ici j'effectue le traitement et je charge le widget texte avec un insert de la façon suivante :
    1 texte1.insert('end'," Mes Variables A Afficher" + "\n")
    2 texte1.pack()

    La réception des évènements pour la fenêtre est :
    fenetre1.mainloop()


    Le problème est que mon traitement s'exécute totalement avant d'afficher les fenêtres et lorsqu'elles s'affichent, elles ont bien le bon contenu. Ainsi si le traitement dure 5 mn, rien ne se passe pendant 5mn et après les fenêtres apparaissent avec tout le contenu.
    Je souhaite que les fenêtres s'affichent vides au début et que le traitement les remplisse au fur et à mesure pour voir le déroulement du process. Ainsi je passe mes 5mn devant des écrans avec des contenus qui défilent.
    A noter que le traitement n'a rien à voir avec les fenêtres, je ne les utilise que pour l'affichage.

    J'espère que j'ai été clair.

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par défaut
    Salut,

    Ce qui peut être compliqué est que les traitements bloquent l'affichage sauf s'ils forcent sa mise à jour ou s'ils s'exécutent dans un thread séparé... Le choix dépend du traitement.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import tkinter as tk
    from tkinter.scrolledtext import ScrolledText
    import time
     
    def do_start():
        for i in range(100):
            w = widgets[i % len(widgets)]
            w.insert('end', '%d\n'% i)
            w.yview_pickplace("end")
            root.update_idletasks()
            time.sleep(0.1)
     
    root = tk.Tk()
    widgets = [ ScrolledText(root, height=10) for _ in range (3) ]
    for w in widgets:
        w.pack()
    tk.Button(root, text='start', command=do_start).pack()
    tk.mainloop()
    "do_start" est un callback. Si je me contente d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def do_start():
        for i in range(100):
            w = widgets[i % len(widgets)]
            w.insert('end', '%d\n'% i)
            w.yview_pickplace("end")
    #        root.update_idletasks()
            time.sleep(0.1)
    les mises à jour ne pourront être faite qu'après le "return" du callback (i.e. après qu'on ait rendu la main à tkinter...). root.update_idletasks() force ces mises à jour avant la fin.
    Mais il y a d'autres techniques à voir selon les traitements effectués.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut
    Resalut W, même en changeant de techno, tu vois, mon pb persiste.

    D'abord chapeau pour ton code, propre, court, efficace mais alors pour un débutant .....oupssss

    Je ne pensais pas que cela serait autant difficile de faire cela avec Python. peut-être n'est ce pas le bon langage mais bon.
    Moi qui voulait juste un truc :
    si variable de type A, afficher variable dans fenêtre typeA
    sinon si variable de type B, afficher variable dans fenêtre typeB
    sinon si variable de type C, afficher variable dans fenêtre typeC
    sinon afficher variable dans fenêtre Erreurs

    Cela me paraissait simple. ... Grossière erreur.

    Le fait de lancer le traitement par le bouton génère l'évènement donc on est dans tk plus facile de force l'affichage je suppose. Je vais voir ce que je peux en tirer.
    Et ..... Merci encore

  4. #4
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut
    Suite et fin,

    L'ajout de fen.update_idletasks() a réglé mon problème, l'affiche se fait en temps réel.

    Merci W.

    Prochaine étape, je vais ajouter un graphique qui varie selon les données.....
    Je clos ce topic.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment afficher des rectangles avec Visual Basic
    Par johnburton54 dans le forum VBA Access
    Réponses: 1
    Dernier message: 13/06/2007, 10h12
  2. Réponses: 17
    Dernier message: 22/09/2006, 17h34
  3. comment afficher des données Access sur Word ??
    Par merlubreizh dans le forum Access
    Réponses: 7
    Dernier message: 16/09/2005, 15h07
  4. comment afficher des données Access sur Excel ??
    Par merlubreizh dans le forum Access
    Réponses: 9
    Dernier message: 14/09/2005, 14h38

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