Comment connecter une barre de progression pour une fonction?
J'essaie de connecter une barre de progression vers une fonction pour mon projet.
C'est ce que j'ai jusqu'à présent mais je ne suis sûr de ne rien faire:
def main():
pgBar.start()
function1()
function2()
function3()
function4()
pgBar.stop()
Voici le code où je fais mes barre de progression si cela aide à tous:
pgBar = ttk.Progressbar(window, orient = HORIZONTAL, length=300, mode = "determinate")
pgBar.place(x=45, y=130)
J'ai fait quelques recherches et de comprendre que le tkinter, la fenêtre se fige lors de l'exécution d'une fonction ou quelque chose comme ça. Est-il une manière que je pourrais "dégeler" la fenêtre à la fin de chaque fonction qui est appelée à l'intérieur de la principale?
Vous devez vous connecter pour publier un commentaire.
Depuis tkinter est mono-thread, vous avez besoin d'un autre thread pour exécuter votre
main
fonction sans gel de l'interface graphique. Une approche commune est que le thread de travail met les messages dans un objet synchronisé (comme unFile
), et la partie GUI consomme ce messages, mettre à jour la barre de progression.Le code suivant est basé sur un complet et détaillé exemple sur ActiveState:
Depuis le exemple d'origine sur ActiveState est un peu brouillon de l'OMI (le
ThreadedClient
est assez couplé avec leGuiPart
, et des choses comme le contrôle de la moment de lancer le thread de l'interface utilisateur ne sont pas aussi simples qu'elles pourraient l'être), j'ai refait et a également ajouté un Bouton pour démarrer le nouveau thread.À comprendre le " gel " vous devez comprendre
mainloop()
. L'appel de cette méthode, on commence la tkinter boucle d'événements. Le thread principal est responsable de cette boucle. Par conséquent, lorsque votre travail intensif de la fonction s'exécute dans le thread principal, il est également interférer avec le mainloop. Pour éviter cela, vous pouvez utiliser un secondaireThread
à l'exécution de votre fonction. Il est recommandé que les threads secondaires ne sont pas donné accès à tkinter objets. Allen B. Taylor, auteur de mtTkinter, les états:Vous pouvez avoir le thread secondaire placer des informations dans un
File
. Alors avoir une fonction qui vérifie le File d'attente chaque x millisecondes, dans le mainloop, via leaprès()
méthode.D'abord, décidez ce que vous voulez que la valeur de la Progressbar's maximum option.
C'est la Barre de progression maximale de la valeur de l'indicateur (le nombre d'unités requises pour remplir la Barre de progression).
Par exemple, vous pouvez définir
maximum=4
et puis la valeur de l'indicateur dans la File d'attente après chacun de vos quatre fonctions. Le thread principal peut ensuite récupérer ces valeurs (à partir de la File d'attente) pour définir le progrès par l'intermédiaire d'untkinter.IntVar()
.(Notez que si vous utilisez
progbar.step()
, la Barre de progression se remet à 0 (vide) à la fin, au lieu de 4 (complètement rempli).)Voici un rapide coup d'oeil à la façon dont vous pouvez utiliser un
tkinter.IntVar()
avec une Progressbar:Voici un exemple basé sur votre propre (rebaptisé le "principal" de la fonction "arbitraire"):
Si tout ce que vous voulez, c'est quelque chose qui indique à l'utilisateur qu'il y a de l'activité
vous pouvez définir la Progressbar est mode option pour
'indeterminate'
.L'indicateur rebondit en arrière et en avant dans ce mode (la vitesse a trait à l'option maximum).
Ensuite, vous pouvez appeler la Progressbar est
start()
méthode directement avant de démarrer le thread secondaire;et puis d'appeler
stop()
aprèssecondary_thread.is_alive()
retourne Faux.Voici un exemple:
→ Progressbar de référence
Vous devez utiliser:
self.pgBar.step(x)
où " x " est le montant accru dans la progressbar.
pour cette mis à jour dans votre INTERFACE utilisateur, vous devez mettre
self.window.update_idletasks()
après chaqueself.pgBar.step(x)
déclaration