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 :

Progress bar en multi-threading


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Progress bar en multi-threading
    Bonjour à tous

    dans un programme, j'ai une portion de code qui effectue des copies de fichiers. Mon problème c'est que la GUI est figée pendant cette copie, et donc je me suis dit que ce serait pas mal d'ajouter une Progress Bar.
    Après un 1er essai où la progress bar, elle aussi, reste figée pendant la copie, je me suis penchée sur le multi-threading. Mais là, je n'arrive à rien :/

    Voilà un bout du code :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    class Files_copy_setup(Tkinter.Tk):	#Copy the selected file(s) in local
    	def __init__(self, parent):
    		Tkinter.Tk.__init__(self, parent)
    		self.parent = parent
    		self.initialize()
     
    	def initialize(self):
    		self.grid()
    		texte = Tkinter.Label(self, text = copied_files_text, fg = "white", bg = "blue")
    		texte.grid(row = 0, sticky = 'EWN')
    		j = 0
    		for elt in input_values.files_to_detect:
    			self.texte = Tkinter.Label(self, text=elt, fg = "black", bg = "red")
    			self.texte.grid(row = 2 + j)
    			j = j + 1
    		button_continue = ttk.Button(self, text = u"Continue", command = self.OnButtonClickContinue)
    		button_continue.grid(row = (len(input_values.files_to_detect) + 3), sticky = 'S')
    		button_back = Tkinter.Button(self, text = u"Back", command = self.OnButtonClickBack)
    		button_back.grid(row = (len(input_values.files_to_detect) + 4), sticky = 'S')
    		button_kill = Tkinter.Button(self, text = u"Quit", command = self.OnButtonClickKill)
    		button_kill.grid(row = (len(input_values.files_to_detect) + 5), sticky = 'S')
     
    		self.alive = ttk.Progressbar(self, orient = "horizontal", length = 200, mode = "indeterminate")
    		self.alive.grid(row = (len(input_values.files_to_detect) + 6), sticky = 'S')
    		self.update()
    		self.geometry("%dx%d+%d+%d" % (self.winfo_reqwidth(), self.winfo_reqheight(), (self.winfo_screenwidth() - self.winfo_reqwidth()) / 2, (self.winfo_screenheight() - self.winfo_reqheight()) / 2))
    		self.resizable(False, False)
    		self.geometry(self.geometry())
    		self.mainloop()
     
    	def OnButtonClickContinue(self):
     
    		self.alive.start()
    		input_values.completion = 1
     
    		for i in input_values.files_to_detect:
    			full_file_name2 = os.path.join(input_values.path_video, i)
    			if not(os.path.isfile(full_file_name2)):
    				thread_copy = threading.Thread(shutil.copy(os.path.join(input_values.path_video_remote, i), input_values.path_video))
    				thread_copy.start()
     
    		self.destroy()
     
    	def OnButtonClickBack(self):
    		app = Fourth_Variable_Choice_remote(None)
    		input_values.completion = 0
    		self.destroy()
     
    	def OnButtonClickKill(self):
    		input_values.completion = 0
    		input_values.next_step_var = 1
    		self.destroy()
    Et comme je ne maitrise ni la Progress Bar, ni le threading, je sais pas du tout comment faire en sorte que ça fonctionne...

    Si qq'un peut m'éclairer là-dessus, ce serait bien urbain

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Vous devez incrémenter* self.alive (.step(valeur)) dans la boucle de OnButtonClickContinue.
    Soit vous le faite dans le for soit lorsque un thread se termine (plus réaliste).
    Dans le cadre de for c'est simple (voir l'exemple)
    Dans le cadre du thread il faudra en faire une classe.
    Attention, évitez de toucher un objet Tk à partir du thread lui même.

    @+

    *
    Un exemple. Ici Sample simule une progression, tout comme votre for dans la liste.
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    try:
        import tkinter as Tk
        from tkinter import ttk
    except:
        import Tkinter as Tk
        import ttk
     
     
     
    def Sample(val, event=None, ival=1):
        pb.step(ival)
        val += ival
        l.config(text=str(val))
        if val != maxl:
            root.after(100, lambda: Sample(val))
        else:
            l.config(text="FIN")
            btn.config(text="Quitter", command=root.quit)
     
    maxl = 500
    root = Tk.Tk()
    root.title('test: ttk.Progressbar')
    l = Tk.Label(root)
    l.pack(padx=5, pady=5)
    pb = ttk.Progressbar(root, length=maxl, maximum=maxl)
    pb.pack(padx=5, pady=5)
    btn = Tk.Button(root, text="Lancer le test")
    btn.bind("<Button-1>", lambda e: Sample(0, e))
    btn.pack(padx=5, pady=5)
    root.mainloop()
    Edit: Oups. Pas fonction mais classe.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    OK, merci. Je suis pas sur d'avoir tout saisi, mais je vais essayer à partir de là

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé, mais j'y arrive pas du tout...
    Là, la progress bar se déclenche une fois que la copie est finie, et le programme n'enchaine pas sur la suite de mon code...

    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
    19
    20
     
    	def OnButtonClickContinue(self):
    		self.alive.start()
    		input_values.completion = 1
    		val = 0
    		ival = 1
    		maxl = 50
     
    		for i in input_values.files_to_detect:
    			full_file_name2 = os.path.join(input_values.path_video, i)
    			self.alive.step(ival)
    			val += ival
    			if val != maxl:
    				self.after(100)
    			else:
    				pass
    			if not(os.path.isfile(full_file_name2)):
    				shutil.copy(os.path.join(input_values.path_video_remote, i), input_values.path_video)
    		self.alive.mainloop()
    		self.destroy()

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'est plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        def OnButtonClickContinue(self):
            input_values.completion = 1
            val = 0
            self.alive.config(maximun=len(input_values.files_to_detect))
            for i in input_values.files_to_detect:
                full_file_name2 = os.path.join(input_values.path_video, i)
                if not os.path.isfile(full_file_name2):
                    shutil.copy(os.path.join(input_values.path_video_remote, i), input_values.path_video)
                val += 1
                self.alive.step(val)
            self.destroy()
    @+

    Edit: maxl est inutile ici.
    Edit 2: Attention ! Lors de mes réponses je transforme vos tabulations par 4 espaces.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    C'est un peu mieux, mais j'ai toujours le même souci :
    la progress bar reste figée pendant la copie de fichiers :/

    Il va falloir que je passe par les threads je pense

    Merci encore, je vais tester 2-3 trucs et revenir ici si je sèche encore

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

    Citation Envoyé par lestatbzh Voir le message
    C'est un peu mieux, mais j'ai toujours le même souci : la progress bar reste figée pendant la copie de fichiers :/
    La progress bar doit être mise à jour après la copy de chaque fichier.
    Passer par les threads ne permettra que d'avoir un IHM "reactif" pendant la copy.
    => Ce n'est pas inintéressant mais, cela ne fera peut être pas ce que vous vous attendez à...

    - W

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par wiztricks Voir le message
    => Ce n'est pas inintéressant mais, cela ne fera peut être pas ce que vous vous attendez à...
    C'est la vrais question en fait: souhaitez vous vraiment donner une indication sur l’avancement réel ou avoir un 'mouvement' qui permet de voir que cela 'tourne' ?

    @+

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Pardon, j'ai été obligé de mettre mon projet de côté quelques temps...

    Pour répondre à la question, je veux juste que l'user sache qu'une action est en train de se réaliser en tâche de fond.
    Pour l'instant, ma fenêtre TkInter freeze complètement, c'est donc pourquoi j'aimerais une progress bar, sans qu'elle ne montre l'avancement exact, mais qui explicitement montre que qqch se passe
    Sachant qu'il n'y a jamais bcp de fichiers à copier, mais qu'ils sont susceptibles d'être gros, parfois jusqu'à 20-25Go. Donc updater après chaque copie ne serait pas assez explicite je pense.

  10. #10
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par lestatbzh Voir le message
    je veux juste que l'user sache qu'une action est en train de se réaliser en tâche de fond.
    Une alternative (plus simple à coder) serait de transformer simplement le curseur de la souris en sablier. Ça se fait souvent et c'est parlant aussi, je trouve.

    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
    try:import Tkinter
    except:import tkinter as Tkinter
     
    def longTask(win):
        old_cursor = win['cursor']
        win['cursor'] = 'watch'
        win.update()
        for x in range(100000000):
            pass
        win['cursor'] = old_cursor
     
    win = Tkinter.Tk()
    Tkinter.Button(win, text='EXECUTE', command=lambda win=win:longTask(win)).grid()
    win.geometry("800x600")
    win.mainloop()
    A+

    Pfeuh

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Effectivement, ça peut le faire aussi

    Je vais tenter ça, merci

  12. #12
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Il faudrait avoir un indicateur minimum plutôt que range.
    Si on utilise une liste avec un .append(False) à chaque lancement d'un thread et que l'on donne au thread l'index dans la liste il suffit de faire liste[index] = True après le shutil.copy.
    Une simple fonction du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def verif_fin(self):
        if all(liste):
            self.win['cursor'] = self.old_cursor
        else:
            self.after(10, self.verif_fin)
    permets de ne pas bloquer l'IHM.

    Ceci dit si l'on souhaite donner une vrais indication il est possible de travailler sur la taille des fichiers (os.path.getsize(path)/os.stat(f).st_size).
    La somme étant la taille de la Progress Bar il suffit après de vérifier* celle ci.

    *
    .after() comme si dessus.
    une liste
    liste_copie.append((full_file_name2, os.path.getsize(full_file_name2)))
    avec suppression de l'item lorsque celui-ci est fini de copier afin ne pas rechercher sa taille inutilement (os.path.getsize du fichier liste[index][0] == liste[index][1]).
    Modifier la Progress Bar en fonction de la somme des tailles.
    les méthodes en local serait sans doute un plus.

  13. #13
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Escuser le dérangement mais c'est quoi la ttk.Progressbar, je ne connait pas ce widget mais si c'est du python 3 c'est normal. J'ai essayer d'importer ttk mais python me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImportError: No module named ttk
    et j'ai regarder dans la logithèque pas de ttk.

  14. #14
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,
    Citation Envoyé par Luke spywoker Voir le message
    c'est quoi la ttk.Progressbar
    Je ne connaissais pas non plus, ça doit venir de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
        import tkinter as Tk
        from tkinter import ttk
    except:
        import Tkinter as Tk
        import ttk
    Google ne sort pas grand chose sur ttk. PauseKawa, aurais tu un lien vers de la doc?

    A+

    Pfeuh

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

    ttk est une extension de tk qui apporte les 'styles' et de nombreux widgets "intéressants". Ces extensions sont pratiquement "inclues" dans tk mais restent préfixées par ttk pour ne pas casser les code existants.
    Pour ce qui est de la doc (tk est une bibliothèque TCL utilisée aussi par Python, PERL, Ruby,...) regardez à http://www.tkdocs.com/
    Cordialement,

    - W

  16. #16
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Petites précisions quand même.

    ttk, outre que le fait de fournir de nouveaux Widgets tels que le Notebook, apporte surtout des effets visuels tels que les thèmes, la transparence des fenêtres, l'anti-alliasing pour les fontes.
    Il est construit comme tk mais vous comprendrais que ses effets ne sont pas applicables 'aux parents' (il aurait fallu refaire tout tk), d’où sa différentiation.

    Il n'est disponible qu'a partir de Tcl/Tk 8.5* dont il utilise les évolutions.

    Vous trouverez une petite description dans la doc Python sous Graphical User Interfaces with Tk pour la version 2.7 (prés version 3) puis 3.x..

    Comme le dit wiztricks les docs en ligne sont plus généralistes que pour le wrapper T(t)kinter.

    @+

    * Pour tester votre version:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> Tkinter._test()
    >>> try:
    ...     import Tkinter as Tk
    ... except:
    ...     import tkinter as Tk
    ... 
    >>> Tk._test()

  17. #17
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Il faudrait avoir un indicateur minimum plutôt que range.
    Si on utilise une liste avec un .append(False) à chaque lancement d'un thread et que l'on donne au thread l'index dans la liste il suffit de faire liste[index] = True après le shutil.copy.
    Une simple fonction du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def verif_fin(self):
        if all(liste):
            self.win['cursor'] = self.old_cursor
        else:
            self.after(10, self.verif_fin)
    permets de ne pas bloquer l'IHM.

    Ceci dit si l'on souhaite donner une vrais indication il est possible de travailler sur la taille des fichiers (os.path.getsize(path)/os.stat(f).st_size).
    La somme étant la taille de la Progress Bar il suffit après de vérifier* celle ci.

    *
    .after() comme si dessus.
    une liste
    liste_copie.append((full_file_name2, os.path.getsize(full_file_name2)))
    avec suppression de l'item lorsque celui-ci est fini de copier afin ne pas rechercher sa taille inutilement (os.path.getsize du fichier liste[index][0] == liste[index][1]).
    Modifier la Progress Bar en fonction de la somme des tailles.
    les méthodes en local serait sans doute un plus.
    J'ai laissé tomber les threads car j'y arrive pas du tout...
    Mais utiliser la taille totale des fichiers à transférer est une bonne piste pour implémenter cette progress bar, merci

  18. #18
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci pour ces précisions sur ttk mais je n'arrive pas a importer ttk depuis la version 2.6.5 de python, je connaissais déjà les widgets supplémentaires de Tkinter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import tkFileDialog
    import tkSimpleDialog
    import tkColorChooser
    import tkMessageBox
    import ttk
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    ImportError: No module named ttk
    Et je ne trouve pas de ttk dans la logithèque et dans la LTS d'Ubuntu la version 2.7 de python n'est plus dans la logithèque donc pas moyen de tester ttk...

  19. #19
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    bizarre...
    moi je suis en Python 2.7 et j'importe ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import os, shutil, datetime, subprocess, shlex, sys, glob, re, Tkinter, ttk
    et aucun souci

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

    ttk n'est livré avec les bibliothèques standards Python qu'à partir de 2.7 et 3.1
    Pour 2.6, il devrait être possible d'installer pyttk

    - W

Discussions similaires

  1. [Débutant] Progress bar dans un nouveau thread ?
    Par yayou49 dans le forum VB.NET
    Réponses: 6
    Dernier message: 30/03/2015, 11h45
  2. [Débutant] BackgroundWorker, Progress Bar et utilisation de Thread multiples ?
    Par iOops dans le forum VB.NET
    Réponses: 9
    Dernier message: 12/03/2013, 19h26
  3. Thread, delegate, join, process et progress bar
    Par LsMarx dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/08/2012, 13h18
  4. Progress bar et thread
    Par Invité dans le forum C#
    Réponses: 2
    Dernier message: 21/02/2012, 22h49
  5. Thread, Fenêtre Modal et Progress Bar
    Par Angelinsky7 dans le forum C#
    Réponses: 7
    Dernier message: 24/09/2009, 23h03

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