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 :

Créer une progressbar indiquant le % de chargement


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 16
    Points
    16
    Par défaut Créer une progressbar indiquant le % de chargement
    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.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    C'est le téléchargement que tu dois exécuter dans un thread, pas la mise à jour des widgets. M'étonne d'ailleurs que tu n'aies pas de plantage avec ça.

    C'est un simple fichier ou un lien rtmp que tu télécharges ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    Bonjour.
    C'est un simple fichier et pas un lien rtmp.

    Merci de votre réponse. Vu que je suis noob, comment je dois faire pour lancer
    le téléchargement dans un thread ? Car j'avais tenté de faire un truc du genre

    urllib.request.urlretrieve(sd, "mymovie.mp4", Thread(target=Telecharger.reporthook)

    ou

    Thread(target= (urllib.request.urlretrieve(sd, "mymovie.mp4", Telecharger.reporthook) )

    mais bon je pense bien que c'est pas la bonne méthode.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Un exemple basique:
    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
     
    import urllib.request
    import time
    from threading import Thread
     
    class Telecharger(object):
        def __init__(self):
            self.count = 0
            self.block_size = 0
            self.total_size = 0
     
        def get_file(self):
            time.sleep(0.2)
            urllib.request.urlretrieve('http://www.oqapy.eu/releases/qarte-1.8.1.tar.gz', "qarte-1.8.1.tar.gz", self.reporthook)
     
        def reporthook(self, count, block_size, total_size):
            self.count = count
            self.block_size = block_size
            self.total_size =  total_size
     
    Tel = Telecharger()
    Thread(target=Tel.get_file).start()
     
    for i in range(10):
        time.sleep(0.1)
        print(Tel.count, Tel.block_size, Tel.total_size)
    Dans la console, tu verras que le téléchargement et la boucle for i in range(10) s'exécute en même temps.

    Les time.sleep() ne sont là que pour l'exemple, sinon tout va trop vite. mais tu devras probablement temporiser la boucle toujours pour éviter de figer l'appli.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    j'ai séparé ma fonction __init__ en deux.

    maintenant __init__ récupère le lien entré et créé un thread vers la fonction
    dl qui se charge de télécharger le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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() )
                Thread(target=Telecharger.dl(sd)).start()
    et toujours dans ma class Telecharger j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def dl(url):
                  urllib.request.urlretrieve(sd, "video.mp4", Telecharger.reporthook)
    et mon reporthook n'a pas changé. Cependant cela ne fonctionne toujours pas.
    Ce que je comprends pas c'est que j'écris des choses en console comme la
    vitesse de téléchargement... et ces choses s'actualisent tout le temps pour donner
    l'information en temps réel, alors que ma barre de progression ne s'actualise
    toujours pas...

    Merci de votre aide

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2010, 22h34
  2. Créer une simple progressbar dans un WebBrowser
    Par aus3004 dans le forum VB.NET
    Réponses: 9
    Dernier message: 02/05/2010, 19h48
  3. [Vxi] créer une dimension indiquant le dernier mois de ma sélection
    Par emmaja dans le forum Designer
    Réponses: 1
    Dernier message: 01/02/2010, 11h26
  4. Chargement d'image pour créer une texture
    Par sir_gcc dans le forum OpenGL
    Réponses: 2
    Dernier message: 29/12/2008, 22h49
  5. Réponses: 1
    Dernier message: 09/05/2008, 17h09

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