Bonjour à tous.
J'essaie en vain de réaliser un programme qui télécharge un fichier à partir
d'un lien internet. Pour ce faire j'ai créer une interface graphique basique avec
une progressbar (via tk) des labels une input et un bouton.

Ce que je voudrais faire : Quand je rentre l'url du fichier à télécharger et que
je clique sur le bouton 'Go' le fichier se télécharge et ma barre de progression
se remplit indiquant le pourcentage du fichier télécharger. Deux labels supplé-
-mentaires indiquent également la taille du fichier téléchargé et la vitesse du
téléchargement.

Ce qui se passe : Quand je clique sur le bouton 'Go' après avoir entré l'url du
fichier à télécharger. Le fichier se télécharge (on peut voir cela dans la console
car j'ai mis des textes qui indiquent si le fichier se télécharge) mais ma progress-
bar n'avance pas et mes labels de mon interface n'indiquent rien. L'application
se freeze littéralement et je dois attendre la fin du téléchargement pour pouvoir
reprendre la main sur l'application...

Je pense que je dois utiliser les threads mais je sais pas comment exactement.
J'ai déjà vu plein de trucs sur le sujets sur stackoverflow et developpez mais
rien qui ne fonctionne comme je le souhaite, sachant que je suis un newbie.

Voilà le code que j'ai écrit pour l'instant :
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
54
55
56
57
58
59
    from tkinter import *
    import urllib.request
    import time
    import sys
    import ttk
    from threading import Event, Thread
 
    class Telecharger(object):
        """Evalue l'expression (url ou code) et télécharge le fichier du site concerné"""
        def __init__(self):
            sd = str(entree1.get() )
            urllib.request.urlretrieve(sd, "mymovie.mp4", Telecharger.reporthook)
 
 
        def reporthook(count, block_size, total_size):
            global start_time
            if count == 0:
                start_time = time.time()
                time.sleep(1)
                return
            def guiloop():
                # Information appear in console
                duration = time.time() - start_time
                progress_size = int(count * block_size)
                speed = int(progress_size / (1024 * duration))
                percent = int(count * block_size * 100 / total_size)
                sys.stdout.write("\r...%d%%, %d MB, %d KB/s, %d seconds passed" %
                                (percent, total_size / (1024 * 1024), speed, duration))
                sys.stdout.flush()
 
                # ProgressBar don't evolve :(
                barreProgression["value"] = percent
                chaine.configure(text = str(speed) + "KB/s")
 
            Thread(target=guiloop).start()
 
    fen = Tk()
    fen.withdraw()
    fen.title("Test")
 
    cadre1 = Frame(fen, width = 400, height = 80).pack(side = TOP)
 
    Label(cadre1, text='Downloader').place(y = 25, width = 400)
    Label(cadre1, text='URL : ').place(y = 50, width = 120)
 
    entree1 = Entry(cadre1, bd='5')
    entree1.bind("", Telecharger)
    entree1.place(x = 120, y = 50, width = 200)
 
    Button(cadre1, text='Go', command = Telecharger).place(x = 330, y = 50, width = 50)
 
    cadrProgress = Frame(fen, width = 400, height = 60).pack()
    barreProgression = ttk.Progressbar(fen, length=260, orient="horizontal", mode="determinate")
    barreProgression.place(y = 100, x = 10, width = 200)
    chaine = Label(fen, text="poids : 0 MB, vitesse = 0 KB/s")
    chaine.place(y = 100, x = 220, width = 170)
    fen.after(500, fen.deiconify)
 
    fen.mainloop()
Mmerci par avance
Bonne journée.