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

PyQt Python Discussion :

Threads et urlretrieve


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut Threads et urlretrieve
    Bonjour,

    je cherche à réaliser un module permettant de télécharger un fichier.

    Pour le moment, j'ai réalisé une simple fenêtre avec une progressbar et un bouton qui lance un téléchargement.
    Bien entendu, je désire que la progressBar soit mis à jour en fonction de la progression du téléchargement.
    Je suppose que les threads vont servir mais je ne sais pas comment y parvenir.
    Avez vous déjà mis en place ce genre de solution? Merci

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    La solution dépendra du framework graphique.

    Pour ne citer qu'un exemple, avec Qt, il faudra 'sortir' du thread au moyen d'un signal parce que la progressBar est un pixmap et doit être mis à jour dans la main loop.

    Mais je te rassure, ça n'a rien de bien compliqué.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut
    ok, j'utilise beaucoup qt.

    Y a t il un avantage a utiliser Qthread? comment met on en place?

    Pour obtenir la taille en cours du fichier téléchargé, dois je utiliser la classe urllib ou alors dois je faire un getinfo du fichier en téléchargement?

    merci

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    En fait je ne pensais pas spécialement aux QThread, je préfère utiliser python pour tout ce qu'il fait tout seul sans passer par une librairie, mais pour y avoir jeté un oeil, les QThread me semblent aussi simple à mettre en oeuvre.

    Pour le téléchargement, je ne sais pas trop quel est le meilleur moyen d'en connaître l'avancement.

    J'ai fais une interface pour une appli qui download les vidéos de Arte+7 mais ce n'est pas moi qui ait écrit la partie téléchargement, je n'ai fais que l'adapter à Qt avec entre autre un signal dans le thread de téléchargement pour mettre à jour la QProgressBar.

    Si ça peut t'inspirer, le code est ici:
    http://bazaar.launchpad.net/~arte+7r...rder-qt-0.2.1/

    avec:
    arte7recorder.py le main
    arte7_ui.py l'interface
    Catalog.py qui sert à dresser la liste des contenu

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 473
    Points : 9 268
    Points
    9 268
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je confirme que la mise en oeuvre des QThread est aussi simple (et quasi identique) aux threads "normaux" de Python. En ce qui me concerne, j'utilise plutôt Qthread avec PyQt4.

    Pour résoudre le pb posé, ce que je sais pas, c'est s'il y a un indicateur de progression du téléchargement qu'on peut interroger périodiquement. Et il faudrait qu'on ait dès le début du téléchargement la valeur maxi.

    Dans ce cas, en plus du QThread qui se charge du téléchargement, on peut utiliser la classe QTimer, en donnant un intervalle de, par exemple, 100 millisecondes, ce timer lancera donc un signal périodique qui déclenchera une méthode de la fenêtre graphique, qui lira la progression, la comparera par rapport au maxi, et mettra à jour la progressBar. J'ai déjà utilisé cela: ça marche très bien.

    En tout cas, il ne faut pas que les threads touchent au graphique: il faut donc systématiquement utiliser les échanges de messages (QtCore.SIGNAL).

    Si tu veux creuser cette solution, dis-le!

    Tyrtamos

    Edit: je viens de regarder urlretrieve de urllib: il peut envoyer, en déclarant une fonction avec reporthook, les infos de progression du téléchargement: on peut donc utiliser cette fonction au lieu du QTimer pour envoyer un message à la fenêtre graphique afin de mettre à jour la progressBar.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

    example utilisant le reporthook d'urlretrieve pour afficher la progression.
    Comme çà ne fait copier que le script courant en "bidon.txt", c'est assez limité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from urllib import urlretrieve
     
    def fetch(url, toFileName):
        def reporthook(count, blockSize, totalSize):
            print count, blockSize, totalSize
     
        urlretrieve(url, toFileName, reporthook)
     
    if __name__ == '__main__':
        import os
        url = 'file:///%s' % os.path.abspath(__file__)
        print 'url: ', url
        fetch(url, 'bidon.txt')
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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