Page 1 sur 1
[R] Interaction ProgressBar + Download
Posté : ven. 26 oct. 2012 03:51
par 4sp4rt4m3
Bonjour à tous,
Je cherche à faire un faire interagir le téléchargement d'un fichier avec une ProgressBar. J'ai bien vu quelques exemples comme
ici ou sur le forum US (ils le propose avec ProgressOn, ce n'est pas ce que je veux) mais je bloque toujours... Je viens donc demander un peu d'aide ^^
Code de Silvere :
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
Global $Form1 = GUICreate("Form1", 210, 62, 303, 192)
Global $Progress1 = GUICtrlCreateProgress(8, 8, 193, 41)
GUISetState(@SW_SHOW)
$lien_fichier = "http://www.exemple.fr/teste.zip"
$telechargement = InetGet($lien_fichier, @ScriptDir & "\teste.zip", 1, 1)
$taille_fichier = InetGetInfo($lien_fichier, 1)
While Not InetGetInfo($telechargement, 2)
$taille_telecharger = InetGetInfo($telechargement, 0)
GUICtrlSetData($Progress1, $taille_telecharger / $taille_telecharger * 100)
WEnd
Visiblement cela a marché pour lui, mais "$taille_telecharger / $taille_telecharger * 100" pour moi ça fera toujours 100 peu importe les valeurs de "$taille_telecharger"! Ou alors suis je à coté de la plaque?
Le mien :
► Afficher le texte
Code : Tout sélectionner
Case $BtDownload
Global $Dir = FileSaveDialog("Sauvegarder sous...", @DesktopDir, "Tout les fichiers (*.*)")
Global $URL = GUICtrlRead($Input1)
$Download = InetGet($URL, $Dir, 1) ;Telecharge
$TotalSize = InetGetInfo($Download,1) ;Obtient la taille du fichier
While not InetGetInfo($Download, 2) ;Tant que le telechargement n'est pas complet
Sleep(200)
$KbRecu = InetGetInfo($Download, 0) ;Obtient les KiloOctet reçu
$Pourcentage = $KbRecu / $TotalSize * 100 ;calcul le pourcentage
GUICtrlSetData($Progress1, $Pourcentage) ;transfere le pourcentage a la valeur de la ProgressBar
WEnd
Jusqu'à présent le téléchargement fonctionne parfaitement mais la ProgressBar, elle , ne bouge pas d'un pli... ça fait 3h que je planche dessus et je n'ai plus trop l'esprit clair pour avancer ^^
Merci de vos aides (éventuelle)
Re: [..] Interaction ProgressBar + Download
Posté : ven. 26 oct. 2012 11:24
par FireFox
Bonjour,
4sp4rt4m3 a écrit :
Visiblement cela a marché pour lui, mais "$taille_telecharger / $taille_telecharger * 100" pour moi ça fera toujours 100 peu importe les valeurs de "$taille_telecharger"! Ou alors suis je à coté de la plaque?
Alors là, c'est une question de logique; si tu divises un nombre par lui même, ça donnera forcément 1, donc si tu réfléchies, le calcul correct est :
Cdlt, FireFox.
Re: [..] Interaction ProgressBar + Download
Posté : ven. 26 oct. 2012 12:57
par 4sp4rt4m3
Donc on est bien d'accord, néanmoins mon script est toujours faux...
Re: [..] Interaction ProgressBar + Download
Posté : ven. 26 oct. 2012 13:19
par mikell
Re: [..] Interaction ProgressBar + Download
Posté : ven. 26 oct. 2012 13:27
par FireFox
4sp4rt4m3 a écrit :Donc on est bien d'accord, néanmoins mon script est toujours faux...
En effet, tu appelles la fonction InetGet en mode synchronous, donc le script ne continue pas tant que le téléchargement n'est pas fini, il faut donc mettre le 4ème paramètre à 1 pour que la fonction se mette en background (asynchronous) pour que tu puisse avoir les infos en direct.
A noter aussi que tu ne peux pas avoir la taille du fichier pour certains téléchargements tant que le téléchargement n'a pas commencé :
► Afficher le texte
Code : Tout sélectionner
GUICreate("MyGUI")
$Input1 = GUICtrlCreateEdit("http://shv.globetrotter.net/data/fichier_5mb_file.bin", 10, 10, 200, 20)
$Progress1 = GUICtrlCreateProgress(10, 30, 100, 20)
GUISetState()
Global $Dir = FileSaveDialog("Sauvegarder sous...", @DesktopDir, "Tout les fichiers (*.*)", 3, "fichier_5mb_file.bin")
Global $URL = GUICtrlRead($Input1)
Global $Download = InetGet($URL, $Dir, 1, 1) ;Telecharge
Global $TotalSize = 0
While Not InetGetInfo($Download, 2) ;Tant que le telechargement n'est pas complet
Sleep(200)
$KbRecu = InetGetInfo($Download, 0) ;Obtient les KiloOctet reçu
If $KbRecu > 0 Then
If $TotalSize = 0 Then
$TotalSize = InetGetInfo($Download, 1) ;Obtient la taille du fichier
EndIf
$Pourcentage = $KbRecu / $TotalSize * 100 ;calcul le pourcentage
GUICtrlSetData($Progress1, $Pourcentage) ;transfere le pourcentage a la valeur de la ProgressBar
EndIf
WEnd
Cdlt, FireFox.
Re: [R] Interaction ProgressBar + Download
Posté : sam. 21 sept. 2013 13:38
par 4sp4rt4m3
@FireFox Dans ton exemple la progressbar ne se rempli pas à 100% alors que le DL se fait entièrement mais du coup j'ai trouvé la ou j'ai foiré. J'ai déclaré la variable $TotalSize à l'intérieur de la boucle et la ça fonctionne parfaitement. C'était tout bête en fin de compte... Merci à toi du coup!
@mikell Dans ce style de codage, je ne m'y retrouve pas désolé, mais merci quand même ^^
Re: [R] Interaction ProgressBar + Download
Posté : lun. 26 oct. 2015 15:54
par davzell
je fais remonter ce vieux post car le code est parfaitement ce qu'il me faut.
Dans mon cas j'aimerai depuis une GUI lancer un téléchargement (avec un simple bouton).
Ça lancera automatiquement le téléchargement avec la barre de progression dans une seconde GUI.
quand le téléchargement se termine je voudrais que la seconde GUI se ferme mais pas la première.
Or là, la seconde GUI reste à l’écran et si je la ferme tout le code se ferme.
Code : Tout sélectionner
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=..\..\BTtools.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form2 = GUICreate("download", 527, 222, 982, 216)
;~ $Button1 = GUICtrlCreateButton("Ok", 245, 30, 49, 17)
$Button2 = GUICtrlCreateButton("Ok", 245, 50, 49, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button2
;~ Call ("controlOS")
Call ("keybt")
EndSwitch
WEnd
Func keyBT()
GUICreate("MyGUI")
$Input1 = GUICtrlCreateEdit("http://shv.globetrotter.net/data/fichier_5mb_file.bin", 10, 10, 200, 20)
$Progress1 = GUICtrlCreateProgress(10, 30, 100, 20)
GUISetState()
Global $Dir = FileSaveDialog("Sauvegarder sous...", @DesktopDir, "Tout les fichiers (*.*)", 3, "fichier_5mb_file.bin")
Global $URL = GUICtrlRead($Input1)
Global $Download = InetGet($URL, $Dir, 1, 1) ;Telecharge
Global $TotalSize = 0
While Not InetGetInfo($Download, 2) ;Tant que le telechargement n'est pas complet
Sleep(200)
$KbRecu = InetGetInfo($Download, 0) ;Obtient les KiloOctet reçu
If $KbRecu > 0 Then
If $TotalSize = 0 Then
$TotalSize = InetGetInfo($Download, 1) ;Obtient la taille du fichier
EndIf
$Pourcentage = $KbRecu / $TotalSize * 100 ;calcul le pourcentage
GUICtrlSetData($Progress1, $Pourcentage) ;transfere le pourcentage a la valeur de la ProgressBar
EndIf
WEnd
EndFunc
Re: [R] Interaction ProgressBar + Download
Posté : mar. 27 oct. 2015 15:36
par Oversid3
Voila
En gros, une fonction créer les GUI (toutes) et n'affichent que celles dont on a besoin.
Ensuite on affiche ou cache avec GUISetState(@SW_SHOW/HIDE, $gui) en fonction du besoin.
Aussi associé GUISetOnEvent($GUI_EVENT_CLOSE a des actions differentes (quit ou cacher).
Code : Tout sélectionner
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=..\..\BTtools.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $gui1
Global $gui2
Global $Button2
Global $Input1
Global $Progress1
Global $Pourcentage
Opt("GUIOnEventMode", 1)
CreerGUIs()
While(True) ; Boucle infinie pour faire tourner le programme
Sleep(10) ; Permet de ne pas avoir 100% de CPU utilisé
WEnd
Func CreerGUIs()
$gui1 = GUICreate("download", 527, 222, 982, 216)
;~ $Button1 = GUICtrlCreateButton("Ok", 245, 30, 49, 17)
$Button2 = GUICtrlCreateButton("Ok", 245, 50, 49, 17)
GUICtrlSetOnEvent($Button2, "keybt")
GUISetOnEvent($GUI_EVENT_CLOSE, "quit", $gui1)
GUISetState(@SW_SHOW, $gui1)
$gui2 = GUICreate("MyGUI")
GUISetOnEvent($GUI_EVENT_CLOSE, "FermerStatus", $gui2) ;On associe la fonction ALT F4 ou croix rouge a la fonction FermerStatus
$Input1 = GUICtrlCreateEdit("http://shv.globetrotter.net/data/fichier_5mb_file.bin", 10, 10, 200, 20)
$Progress1 = GUICtrlCreateProgress(10, 30, 100, 20)
EndFunc
Func keyBT()
GUISetState(@SW_SHOW, $gui2)
Global $Dir = FileSaveDialog("Sauvegarder sous...", @DesktopDir, "Tout les fichiers (*.*)", 3, "fichier_5mb_file.bin")
Global $URL = GUICtrlRead($Input1)
Global $Download = InetGet($URL, $Dir, 1, 1) ;Telecharge
Global $TotalSize = 0
While Not InetGetInfo($Download, 2) ;Tant que le telechargement n'est pas complet
Sleep(200)
$KbRecu = InetGetInfo($Download, 0) ;Obtient les KiloOctet reçu
If $KbRecu > 0 Then
If $TotalSize = 0 Then
$TotalSize = InetGetInfo($Download, 1) ;Obtient la taille du fichier
EndIf
$Pourcentage = $KbRecu / $TotalSize * 100 ;calcul le pourcentage
GUICtrlSetData($Progress1, $Pourcentage) ;transfere le pourcentage a la valeur de la ProgressBar
EndIf
WEnd
EndFunc
Func FermerStatus() ;fonction qui permet de cacher la GUI2
GUISetState(@SW_HIDE, $gui2)
EndFunc
Func quit()
Exit
EndFunc
Re: [R] Interaction ProgressBar + Download
Posté : mer. 28 oct. 2015 10:54
par davzell
effectivement ça marche nikel comme ça.
mais au final une fois l'outil terminé je me suis rendu compte d'un gros problème.
j'utilise la fonction inetget pour récupérer des fichiers sur un serveur ftp et pas sur du http.
en fonction de la ou je l'utilise la récupération des fichiers ne marche que si mon client ftp est en mode PASSIF, or inetget n'a pas l'air de le gérer....
Du coup il faut que j'arrive a faire la même chose qu'au dessus mais avec la fonction _FTP_Connect...