0

J'essaie de créer une interface graphique où l'utilisateur clique sur un bouton et l'application télécharge un fichier à partir d'Internet. Je veux avoir une barre de progression indiquant combien de temps le téléchargement du fichier est terminé. Pour ce faire, j'ai implémenté un thread pour exécuter la fonction de la barre de progression lorsque le bouton de téléchargement est cliqué. Voici le code que j'utilise:Télécharger la barre de progression ne fonctionne pas, Python 3

def progthread(): 
    threading.Thread(target=download).start() 

def download(): 
    blocknum = 0 
    blocksize = 0 
    url = "https://www.python.org/static/img/python-logo.png" 
    filename = "C:\My Python Apps\MyFile.png" 
    response = requests.get(url, stream=True) 
    total_length = response.headers.get('content-length') 

    with open(filename, "wb") as f: 
     for data in response.iter_content(chunk_size=10000): 
      f.write(data) 
      percent = int(blocknum * blocksize/int(total_length)) 

      progress['value'] = percent 

Lorsque j'exécute l'application, elle télécharge le fichier et aucune erreur ne survient. Mais la barre de progression ne fait rien. J'ai essayé d'utiliser progress.update() et progress.update_idletask() mais la barre de progression ne fonctionnait toujours pas.

Comment puis-je obtenir la barre de progression pour afficher la progression du téléchargement du fichier?

+0

Vous n'avez pas assigné de valeurs à blocknum et blocksize dans la boucle, donc ils sont toujours bloqués à 0. –

Répondre

1

Le problème est que la boucle que vous avez bloque la boucle principale de tkinter, de sorte que toute l'interface graphique se bloque. Pour quelque chose comme ceci, vous devez lancer la boucle de téléchargement dans un thread séparé afin qu'il puisse s'exécuter en même temps que le tkinter mainloop. Vous pouvez utiliser un tkinter IntVar pour mettre à jour la barre de progression de l'autre thread.

Si vous mettez à jour votre question avec un Minimal, Complete, and Verifiable example alors je peux vous aider à l'implémenter.

+0

Je ne suis pas sûr de savoir comment le rendre plus minimal que cela. L'autre version de ce code que j'ai essayé et utilise utilise le paquet 'urllib', mais je sais que beaucoup de sites Web déclenchent des erreurs 403 quand cela est utilisé, donc l'exemple fourni dans la question est ce que j'ai adapté pour ne pas utiliser' urllib '. Mais comment pourrais-je mettre la boucle de téléchargement dans un fil séparé? – RedCode

+0

Okay j'ai compris comment faire le filetage et mis à jour ma question, mais le problème persiste. Honnêtement, je ne sais pas comment rendre mon exemple plus minimal que cela, mais je pense juste maintenant, je pense que cela peut être un problème avec la taille du bloc lors du téléchargement, parce que dans mon code 'urllib' il obtient cette valeur et le renvoie, mais je ne peux pas l'implémenter de la même manière en utilisant le paquet 'requests'. – RedCode

+0

Je ne veux pas que vous la minimisiez, mais la rendre complète et vérifiable. Lisez le lien. Ceci est courant lorsque vous demandez de l'aide en ligne. Faire un programme complet que je peux exécuter, y compris les importations, afin que je puisse vous montrer où le problème est. Bien sûr, je pourrais le faire moi-même; mais j'ai mieux à faire que d'écrire un code standard. – Novel