Page 1 sur 1

[Tuto] Créer une ProgressBar avec pourcentage

Posté : ven. 03 juil. 2009 17:51
par 20100
Bonjour,
  • Je vais vous expliquer pas à pas comment mettre en place une progressbar dans vos long traitement, afin d'assurer à l'utilisateur que le traitement avance. On ajoutera aussi à la progressbar le pourcentage d'avancement du traitement.

    Une image est certainement plus parlante, voila le résultat obtenu :
    Image
    Pour se faire on va voir étape par étape le code associé à la mise en place de ce type de progressbar dans vos long traitement.
    • 1) Fenêtre principale de l'application
    • 2) Initialisation des éléments du GUI
    • 3) Évolution de la progressbar au cours d'un traitement
    • 4) Téléchargement/Affichage source complet

1) Fenêtre principale de l'application

Code : Tout sélectionner

;===========================================================================================================
; Description :  Graphical User Interfaces (GUI) principal de l'application
; Syntaxe     :  _GUI_Main()
; Parametere  :  Aucun
; Return      :  Aucun
;===========================================================================================================
Func _GUI_Main()
    
    ; Création de la Fenetre principale en fond blanc
    Global $main_GUI = GUICreate("Test ProgressBar", 640, 280, -1, -1) 
    GUISetBkColor(0xFFFFFF) 

    ; Initialise les élements utilisés (boutton, label, image ...), par defaut sur le boutton est en statut visible.
    _GUI_progressbar("INIT") 

    GUISetState() 
    Local $msg 
    While 1
        $msg = GUIGetMsg()
        Select
            ; Evenement de fermeture de la fenetre
            Case $msg = $GUI_EVENT_CLOSE 
                ExitLoop
            
            ; Evenement de click sur le bouton "Lancer Traitement"
            Case $msg = $button_traitement
                _simulation_traitement()
            
        EndSelect
    WEnd
    GUIDelete()

    Exit
EndFunc
  • En premier lieu dans cette fonction on initialise les éléments du GUI que l'on va utiliser avec la fonction _GUI_progressbar("INIT").
  • En second temps dans la boucle while on "écoute" les événements comme d'habitude, notamment sur le bouton : Case $msg = $button_traitement. Un click sur ce bouton lancera la fonction _simulation_traitement() qui fera office de simulation d'un long traitement. Pour notre exemple, il s'agit simplement du parcours d'une boucle avec une pause à chaque itération.

2) Initialisation des éléments du GUI

Code : Tout sélectionner

;===========================================================================================================
; Description :  Graphical User Interfaces (GUI) associé à la progressbar
; Syntaxe     :  _GUI_progressbar($action)
; Parametere  :  $action (String)
;                  - INIT = Initialise les éléments GUI associé à la progressbar
;                  - HIDE = Cache les éléments GUI associé à la progressbar
;                  - SHOW = Affiche les éléments GUI associé à la progressbar
; Return      :  Aucun
;===========================================================================================================
Func _GUI_progressbar($action)
    Switch $action
        Case "INIT" 
            Global $button_traitement = GUICtrlCreateButton("Lancer Traitement", 215, 30, 210, 30)          
            Global $img_trait = GuiCtrlCreatePic("trait.jpg", 0, 90, 640,1)
            Global $label_progressbar_traitement = GUICtrlCreateLabel("", 105, 120, 150, 20)
            Global $label_pourcentage_traitement = GUICtrlCreateLabel("(100%)", 482, 120)
            Global $progressbar_traitement       = GUICtrlCreateProgress(100, 138, 420, 20)
            GUICtrlSetFont($label_progressbar_traitement, 8.5, 400, 4) ; Change font & souligne label
            GUICtrlSetFont($label_pourcentage_traitement, 8.5, 400, 0) ; Change font & souligne label
            _GUI_progressbar("HIDE") ; Cache tout les elements sauf $button_traitement
            
        Case "HIDE"
            GUICtrlSetState($img_trait, $GUI_HIDE)
            GUICtrlSetState($label_progressbar_traitement, $GUI_HIDE)
            GUICtrlSetState($label_pourcentage_traitement, $GUI_HIDE)
            GUICtrlSetState($progressbar_traitement, $GUI_HIDE)
            
        Case "SHOW"
            GUICtrlSetState($img_trait, $GUI_SHOW)
            GUICtrlSetState($label_progressbar_traitement, $GUI_SHOW)
            GUICtrlSetState($label_pourcentage_traitement, $GUI_SHOW)
            GUICtrlSetState($progressbar_traitement, $GUI_SHOW)

    EndSwitch
EndFunc
  • Les paramètres de cette fonction sont assez clair pour ne pas avoir besoin de les expliquer.
  • Juste un point particulier lors de l'initialisation des éléments par appel de la fonction _GUI_progressbar("INIT"), je refait un appel de cette fonction avec le paramètre _GUI_progressbar("HIDE")pour cacher certains éléments. Cela permet de ne laisser que le bouton "Lancer le traitement" en cachant les autres éléments.

3) Évolution de la progressbar au cours d'un traitement

Code : Tout sélectionner

;===========================================================================================================
; Description :  Simultation d'un traitement long dont on souhaite suivre la progression avec progressbar
;===========================================================================================================
Func _simulation_traitement()
    
    ; Initialisation de la progressbar pour suivre la simulation
    GUICtrlSetState($button_traitement, $GUI_DISABLE) ; Evite de lancer deux fois le traitement par double click
    GUICtrlSetData($label_progressbar_traitement, "Traitement en cours ...")    ; Changement texte label
    _MAJ_progressbar($progressbar_traitement, $label_pourcentage_traitement, 0) ; Mise à zéro de la progressbar
    _GUI_progressbar("SHOW") ; Affichage de la progressbar et label associé
    
    ; Lancement de la Simulation
    Local $nb_tour_boucle = 146
    For $i = 0 to $nb_tour_boucle-1 Step 1
        ; A chaque passage dans la boucle on incremente la progressbar et le pourcentage d'envoi
        $indice_progressbar = Round( ((100 / $nb_tour_boucle) * ($i+1)), 0)
        _MAJ_progressbar($progressbar_traitement, $label_pourcentage_traitement, $indice_progressbar)
        Sleep(20)
    Next
    
    ; Fin de la simulation
    GUICtrlSetData($label_progressbar_traitement, "Traitement terminé.")
    GUICtrlSetData($button_traitement, "Re-Lancer le Traitement")
    GUICtrlSetState($button_traitement, $GUI_ENABLE)
    _MAJ_progressbar($progressbar_traitement, $label_pourcentage_traitement, 100)
EndFunc


;===========================================================================================================
; Description : Mise à jour de la progressbar et de son label associé par la valeur passé en paramètre
; Syntaxe     : _MAJ_progressbar($id_progressbar, $id_label_pourcentage, $valeur)
; Parametere  : $id_progressbar       = Id de la progressbar
;               $id_label_pourcentage = Id du label pourcentage associé à la progressbar
;               $valeur               = Entier à saisir dans la progressbar et le label pourcentage
; Return      : None
;===========================================================================================================
Func _MAJ_progressbar($id_progressbar, $id_label_pourcentage, $valeur)
    GUICtrlSetData($id_progressbar, $valeur)
    GUICtrlSetData($id_label_pourcentage, "("&$valeur&"%)")
EndFunc
;===========================================================================================================
  • La fonction _MAJ_progressbar a un intérêt lorsqu'on utilise différentes progressbar dans la même application afin de faciliter la lecture du code.

4) Téléchargement/Affichage source complet
► Afficher le texteAfficher la source
ProgressBar.zip
Fichier Source du tuto
(14.02 Kio) Téléchargé 723 fois
ProgressBar.zip
Fichier Source du tuto
(14.02 Kio) Téléchargé 723 fois

Re: [Tuto] Créer une ProgressBar avec pourcentage

Posté : ven. 03 juil. 2009 18:03
par jbnh
Bien expliqué, bien structuré... Un grand bravo, en espérant que d'autre suivent ! Image

Re: [Tuto] Créer une ProgressBar avec pourcentage

Posté : ven. 03 juil. 2009 18:12
par Tlem
Nickel.

Reste plus qu'à rajouter une gestion non liée à la GUI, pour éviter de bloquer la progressBar lors du déplacement de la GUI.
Voir ici : http://www.autoitscript.fr/forum/viewto ... ?f=6&t=910

Re: [Tuto] Créer une ProgressBar avec pourcentage

Posté : ven. 03 juil. 2009 18:19
par 20100
Arigatô Gozaimasu jbnh ^^
C'est toujours une question de temps mais si j'en ai, promis je ferais d'autre tutos.
Reste plus qu'à rajouter une gestion non liée à la GUI, pour éviter de bloquer la progressBar lors du déplacement de la GUI.
Voir ici : http://www.autoitscript.fr/forum/viewto ... ?f=6&t=910
Qu'entends tu par une gestion non liée à la GUI?
En effet je viens de m'apercevoir que la progressbar se bloque lors du déplacement de fenêtre... Je n'avais jamais tester à déplacer la fenêtre lors d'un traitement. Merci du conseil, je vais essayer de corriger.

Re: [Tuto] Créer une ProgressBar avec pourcentage

Posté : ven. 18 sept. 2009 13:18
par jbnh
Maj pour téléchargement. Modifier $var et $var2
► Afficher le texte

Re: [Tuto] Créer une ProgressBar avec pourcentage

Posté : jeu. 24 sept. 2009 12:41
par 20100
Ca me fait penser que je n'ai toujours pas trouvé la "correction" pour le bug de freeze de la progressbar lors du déplacement de la fenêtre.

à Tlem si tu pouvais me donner quelques pistes plus clair c'est pas de refus ^^

Re: [Tuto] Créer une ProgressBar avec pourcentage

Posté : sam. 26 sept. 2009 18:42
par Tlem
Le sujet à été traité dans un 'vieux' message et une solution avait été donnée par Greenhorn.