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

Tkinter Python Discussion :

Insérer une ProgressBar


Sujet :

Tkinter Python

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut Insérer une ProgressBar
    Bonjour,

    Voilà je une perfectionne une interface graphique et je souhaite insérer une ProgressBar.

    Donc pour expliquer rapidement, mon programme principal va travailler sur plusieurs centaines de milliers de dossier (la tache prend 15 min en moyenne) et je souhaite insérer une barre de progression afin de faciliter l'état d'avancement de la tache.

    Voilà le code que j'ai trouvé sur le net, en fait y en a plein, mais celui ci me paraissait plus simple d'utilisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    from Tkinter import *
    import ttk
    root = Tk()
    progressbar = ttk.Progressbar(orient=HORIZONTAL, length=250, mode='determinate')
    progressbar.pack(side="bottom")
    progressbar.start()
    root.mainloop()
    Le problème que j'ai avec ce code c'est qu'a aucun moment on ne lui indique une valeur qui renseigne de l'état d'avancement.

    Je m'explique, imaginons que j'ai 100 000 dossiers à traiter et que j'en suis au 1000 ème je serai à un état d'avancement de 1% et la variation de la barre de progression devra correspondre à 1%.

    Donc comment faire pour renseigner cette valeur d'avancement dans cet exemple ?

    Si je n'ai pas été assez clair n'hésitez pas à me reprendre.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Salut,

    Citation Envoyé par nekcorp Voir le message
    Je m'explique, imaginons que j'ai 100 000 dossiers à traiter et que j'en suis au 1000 ème je serai à un état d'avancement de 1% et la variation de la barre de progression devra correspondre à 1%.

    Donc comment faire pour renseigner cette valeur d'avancement dans cet exemple ?
    100 appels à progressbar.step(2.5) au lieu de .start/.stop.

    - W
    PS: plutôt que de cherchez les exemples, une bonne documentation...
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    100 appels à progressbar.step(2.5) au lieu de .start/.stop.

    - W
    PS: plutôt que de cherchez les exemples, une bonne documentation...
    Je ne comprend pas trop ce que tu as voulu m'expliquer.

    j'ai donc tester ce que j'ai cru comprendre pour analyser ce que ça fait.

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    from Tkinter import *
    import ttk
     
    root = Tk()
    progressbar = ttk.Progressbar(orient=HORIZONTAL, length=250, mode='determinate', value = 0)
    progressbar.pack(side="bottom")
     
    for i in range(0, 99, 1):
        progressbar.step(2.5)
     
    root.mainloop()
    Cependant je ne vois pas la progression de ma barre, elle s'affiche au bout d'un moment (j'ai l'impression que c'est lorsque la boucle termine) et la barre est rempli qu'a moitié.

    Tu m'as dit de faire 100 appels de progressbar.step(2.5) avec un step de 2.5 car la longueur de la barre est de 250 (100*2.5) c'est ça ?

    Merci d'avance.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Cependant je ne vois pas la progression de ma barre, elle s'affiche au bout d'un moment (j'ai l'impression que c'est lorsque la boucle termine) et la barre est rempli qu'a moitié.
    250 = 2.5 * 100. 100 étant le maximum (par défaut) pris comme "modulo" de la somme des valeurs passées au "step". Mais tout cela est écrit dans la documentation non?
    Pour le reste, si vous n'ajoutez pas de délai entre les appels à .step, vous verrez la fin mais pas la progression: çà va trop vite.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    250 = 2.5 * 100. 100 étant le maximum (par défaut) pris comme "modulo" de la somme des valeurs passées au "step". Mais tout cela est écrit dans la documentation non?
    - W
    Ah bon c'est écrit dans la doc ? Je n'ai pas lu cela.

    Je voulais juste comprendre pourquoi le 2.5.

    Citation Envoyé par wiztricks Voir le message
    Pour le reste, si vous n'ajoutez pas de délai entre les appels à .step, vous verrez la fin mais pas la progression: çà va trop vite.
    J'ai ajouté un time.sleep(0.1) (même si j'aime pas ça) et j'ai toujours le même soucis, la barre apparait une fois la boucle terminé. De plus elle est a moitié rempli, ce que je ne comprend pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from Tkinter import *
    import ttk
    import time
     
    root = Tk()
    progressbar = ttk.Progressbar(orient=HORIZONTAL, length=250, mode='determinate', value = 0)
    progressbar.pack(side="bottom")
     
    for i in range(0, 99, 1):
        progressbar.step(2.5)
        time.sleep(0.1)
     
    root.mainloop()

  6. #6
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    la barre apparait une fois la boucle terminé. De plus elle est a moitié rempli, ce que je ne comprend pas.
    Bonjour,
    Il faut "laisser" le temps au rafraîchissement! ;-)
    Essayez cela!
    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
    from tkinter import *
    from tkinter import ttk
    import time
     
    def avance_barre():
        progressbar.step(10)
     
    root = Tk()
    bt = Button(root, text = "avance", command=avance_barre)
    bt.pack()
    progressbar = ttk.Progressbar(orient=HORIZONTAL, length=250, mode='determinate', value = 0)
    progressbar.pack(side="bottom")
     
     
    root.mainloop()
    Clodion

    PS: Attention, je suis en Python3 (il vous faut modifier tkinter en Tkinter et modifier l'import de ttk)!!

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    J'ai ajouté un time.sleep(0.1) (même si j'aime pas ça) et j'ai toujours le même soucis, la barre apparait une fois la boucle terminé. De plus elle est a moitié rempli, ce que je ne comprend pas.
    Avec un GUI comme tkinter, "voir" bouger sera le résultat de callbacks appelés après l'entrée dans la mainloop...

    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
    from Tkinter import *
    import ttk
     
    widget = ttk.Progressbar(orient=HORIZONTAL, mode='determinate')
    widget.pack()
     
    counter = 0
    def update(delay=200):
        global counter
        widget.step(2)
        counter += 2
        if counter < 98:
            widget.after(delay, update)
    update()
    mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [MFC] afficher une ProgressBar dans une barre d'etat
    Par guillaume21 dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2007, 11h16
  2. [XSL] insérer une balise <a name>
    Par guibong dans le forum XMLRAD
    Réponses: 2
    Dernier message: 01/08/2003, 15h04
  3. [CR7] Insérer une image dynamiquement
    Par yoloosis dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 28/07/2003, 09h54
  4. [VB.NET] Insérer une colonne de CheckBox dans un DataGrid
    Par Manue.35 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/05/2003, 11h44
  5. comment programmer une progressbar
    Par Choucas dans le forum Paradox
    Réponses: 3
    Dernier message: 13/11/2002, 11h07

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