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 :

Téléchargment de fichier mise à jour QProgressBar


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut Téléchargment de fichier mise à jour QProgressBar
    Bonjour,
    j'ai actuellement un soucis avec mon code (python3.6 / PyQt5.10) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
     
    window = QtWidgets.QDialog(self.main_window, modal=True, objectName="window", flags=QtCore.Qt.FramelessWindowHint)
    download_bar = QtWidgets.QProgressBar(window, minimum=0, maximum=100)
    download_bar.resize(500, 50)
     
    urllib.request.urlretrieve("https://www.dropbox.com/s/t40pibafvq5s2rt/updater.exe?dl=1", "updater.exe", lambda block_num, block_size, total_size: download_bar.setValue(block_num * block_size / total_size))
     
    window.exec_()
    os.startfile("updater.exe")
    Le problème c'est que je suis dans la boucle de urllib.request.urlretrieve.

    J'ai bien peur qu'il fasse alourdir le code avec un QThread, signal et compagnie .. pour juste un dl de fichier..
    Du coup est-ce qu'il est possible de faire ça sans passer par les QThreads ? je suis convaincu qu'il y à une solution plus simple vus la richesse de Qt, mais les recherches Google sont infructueuses :'(

    Edit Bien sur l'updater ne sera pas dl chaque fois, je ferais un truc du genre comparaison avec du SHA ou MD5.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si le chargement n'est pas trop long, tu peux essayer ça (sans garantie): dans la boucle qui récupère le fichier par bloc, grâce au 3ème argument reporthook de urlretrieve, place cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QCoreApplication.processEvents()
    Cela devrait forcer le traitement de la pile d'évènements du graphique et donc la mise à jour du widget de progression.

    Si ça ne suffit pas: QThread...

  3. #3
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 308
    Par défaut
    Salut,

    C'est déjà la lambda qui fait office de reporthook si je vois bien.

    Remplace plutôt ta lambda par une fonction qui fera la mise à jour de la barre de progression et qui lancera le processEvents()

    C'est sur que sans le processEvents() la barre ne sera mise à jour qu'à la fin du téléchargement.

  4. #4
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Merci bien pour vos réponses, voici mon code fonctionnel (il risque de piquer les yeux par contre , j'aime pas créer des fonctions pour pas grand chose)

    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
    app.closeAllWindows()
    try:
    	ctx = ssl.create_default_context()
    	ctx.check_hostname = False
    	ctx.verify_mode = ssl.CERT_NONE
     
    	window = QtWidgets.QDialog(self.main_window, modal=True, objectName="window", flags=QtCore.Qt.FramelessWindowHint)
    	download_bar = QtWidgets.QProgressBar(window, minimum=0, maximum=100)
    	download_bar.resize(500, 50)
    	window.show()
     
    	url = "https://www.dropbox.com/s/t40pibafvq5s2rt/updater.exe?dl=1"
    	urllib.request.urlretrieve(url, "updater.exe", lambda block_num, block_size, total_size: download_bar.setValue(int(block_num * block_size / total_size * 100)), QtCore.QCoreApplication.processEvents())
    	app.quit()
    	window.exec_()
     
    	# os.startfile("updater.exe")
    except:

    Je me dit même que plutôt que de faire dl un updater qui lui même dl la nouvelle version, dl la nouvelle version depuis l'application avec un nom genre 'tmp' & un .bat serait plus simple
    Puis lancer le .bat qui va supprimer mon logiciel, renommer mon tmp.exe avec le bon nom puis lancer mon l'application.
    Par contre là je m'avance (mais rien n'est impossible en programmation), mais plutôt que de lancer un .bat inclure ça le code... mais en passant par subprocess.call() j'imagine que ça ne marchera pas..

  5. #5
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    J'ai encore un soucis ...

    voici mon code:
    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
    app.closeAllWindows()
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
     
    window = QtWidgets.QDialog(objectName="window", flags=QtCore.Qt.WindowStaysOnTopHint|QtCore.Qt.FramelessWindowHint)
    download_bar = QtWidgets.QProgressBar(window, minimum=0, maximum=100)
    download_bar.resize(500, 50)
    window.show()
     
    url = "https://www.dropbox.com/s/t40pibafvq5s2rt/updater.exe?dl=1"
    urllib.request.urlretrieve(url, "temp", lambda block_num, block_size, total_size: download_bar.setValue(int(block_num * block_size / total_size * 100)), QtCore.QCoreApplication.processEvents())
    time.sleep(1)
    app.quit()
    print('update OK')
    # os.startfile('timeout /t 2 /nobreak>nul && move /y temp Flapilofus.exe && Flapilofus.exe')
    Il est presque quasi fonctionnel mise à part que quand on clique sur la fenêtre / atl tab dessus / ect .. je pense que quand la fenêtre contenant la progressbar obtient le focus que ça freeze.. par contre je n'arrive n'y à comprendre pourquoi, ni comment résoudre çawindow.clearFocus()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. import de fichiers : mise à jour
    Par Marie40200 dans le forum Microsoft Dynamics CRM
    Réponses: 1
    Dernier message: 26/11/2013, 11h02
  2. image,fichiers,mise à jour
    Par christolb59 dans le forum Scilab
    Réponses: 1
    Dernier message: 18/09/2011, 20h03
  3. [Système] mise à jour d'un fichier .htpasswd
    Par ikkyu_os dans le forum Langage
    Réponses: 4
    Dernier message: 15/09/2005, 11h25
  4. [HTML] Problème mise à jour des fichiers en cache
    Par El Riiico dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/09/2005, 18h00
  5. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 15h46

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