Urllib2 et interface graphique

cs_rezuz Messages postés 6 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 14 août 2010 - 14 août 2010 à 17:52
aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 - 23 août 2010 à 10:37
bonjour à tous.

aprés avoir eu de nombreux "problemme" avec les 72 minutes de limitation vidéo de MEGAVIDEO, j'ai décidé de faire un programme qui se sert d'un Thread pour télécharger la vidéo. de cette façon, des le debut du programme il est possible de regarder la vidéo avec le media player de notre choix pendant son téléchargement. et donc ainsi plus de souci de limitation

mon problemme est le suivant :
j'ai donc voulut faire une interface graphique a mon programme pour en faire un executable pour mon frere et des amis qui comprenne rien en programmation et qui seraient pas capable de changer une ligne dans un code
du coup le telechargement est trés lent, voir inexistant et surtout il s'arrete des que l'on lance la video. problemme qui n'apparais pas dans le programme sans interface.

je vais mettre les deux codes : (pour que vous puissiez les utilisers pour megavideo et ^^ qui vous puissiez resoudre ce problemme

code avec interface graphique
# -*- coding: utf-8 -*-"
 
from threading import Thread
import urllib2
import Tkinter
import sys
import os
 
titre = "ma video temporaire.avi"
class Interface(Tkinter.Frame):
    def __init__(self):
        Tkinter.Frame.__init__(self)
        self.master.title("visionneur")
        
        Tkinter.Button(self, text "lancer", fg "blue", command = self.lancer).grid(row = 2, column = 1)
        Tkinter.Button(self, text "Annuler", fg "red", command = self.Annuler).grid(row = 2, column = 2)
        self.entreeAdresse Tkinter.Entry(self, width 150, fg = "grey")
        self.entreeAdresse.grid(row 1, column 1, columnspan = 2)
        self.entreeAdresse.insert(Tkinter.END, "coller l'adresse de la video a visioner/telecharger")
        
        self.grid()
        
    def lancer(self):
        url = self.entreeAdresse.get()
        Th = Thread_telecharge(url)
        Th.start()
    
    def Annuler(self):
        self.master.destroy()
        
    def clean(self, evt):
        self.entreeAdresse.delete(0, Tkinter.END)
        self.entreeAdresse.configure(fg = "black")
        
class Thread_telecharge(Thread):
    def __init__(self, URL_video):
        Thread.__init__(self)
        self.URL_video = URL_video
        
    def run(self):
 
        titre ="ma video temporaire.avi"
        
        #header pour nous faire passer comme un navigateur normal (inutile mais sait on jamaisà)
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = { 'User-Agent' : user_agent }
        req = urllib2.Request(self.URL_video, None, headers)
        vid = urllib2.urlopen(req)
        #on cree le  file fichier en mode ajout et pour des donnees de type binaire
        file = open(titre , "a+b")
        #on recupere la taille du fichier
        lg = vid.headers.get('content-length')
        # on la converti en entier
        lg = int(lg)
        # "buffer"
        data = ''
        #tant que ...
        while True :
            #lire les 4096 octet suivant soit 4 Ko
            data = vid.read(4096)
            #... le buffer n'est pas null apres une lecture
            if not data: break
            #on ecris les donnees dans le ffichier
            file.write(data)
            #on vide le buffer
            data = None
        #histoire de finalise l'ecriture
        file.flush()
        #on ferme le fichier
        file.close()
        print "télécharger"
 
 
if __name__ == "__main__":
    App = Interface()
    App.entreeAdresse.bind("", App.clean)
    App.mainloop()


et le code sans interface :
# -*- coding: utf-8 -*-"
 
from threading import Thread
import urllib2
import Tkinter
import sys
import os
"""
titre = "ma video temporaire.avi"
class Interface(Tkinter.Frame):
    def __init__(self):
        Tkinter.Frame.__init__(self)
        self.master.title("visionneur")
        
        Tkinter.Button(self, text "lancer", fg "blue", command = self.lancer).grid(row = 2, column = 1)
        Tkinter.Button(self, text "Annuler", fg "red", command = self.Annuler).grid(row = 2, column = 2)
        self.entreeAdresse Tkinter.Entry(self, width 150, fg = "grey")
        self.entreeAdresse.grid(row 1, column 1, columnspan = 2)
        self.entreeAdresse.insert(Tkinter.END, "coller l'adresse de la video a visioner/telecharger")
        
        self.grid()
        
    def lancer(self):
        url = self.entreeAdresse.get()
        Th = Thread_telecharge(url)
        Th.start()
    
    def Annuler(self):
        self.master.destroy()
        
    def clean(self, evt):
        self.entreeAdresse.delete(0, Tkinter.END)
        self.entreeAdresse.configure(fg = "black")
        """
class Thread_telecharge(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.URL_video = "http://www697.megaupload.com/files/465ee85072e01802793703c4731d4b2f/FlashForward.S01E19.VOSTFR.HDTV.XviD.avi"
        
    def run(self):
 
        titre ="ma video temporaire.avi"
        
        #header pour nous faire passer comme un navigateur normal (inutile mais sait on jamaisà)
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = { 'User-Agent' : user_agent }
        req = urllib2.Request(self.URL_video, None, headers)
        vid = urllib2.urlopen(req)
        #on cree le  file fichier en mode ajout et pour des donnees de type binaire
        file = open(titre , "a+b")
        #on recupere la taille du fichier
        lg = vid.headers.get('content-length')
        # on la converti en entier
        lg = int(lg)
        # "buffer"
        data = ''
        #tant que ...
        while True :
            #lire les 4096 octet suivant soit 4 Ko
            data = vid.read(4096)
            #... le buffer n'est pas null apres une lecture
            if not data: break
            #on ecris les donnees dans le ffichier
            file.write(data)
            #on vide le buffer
            data = None
        #histoire de finalise l'ecriture
        file.flush()
        #on ferme le fichier
        file.close()
        print "télécharger"
 
"""
if __name__ == "__main__":
    App = Interface()
    App.entreeAdresse.bind("", App.clean)
    App.mainloop()
"""
Th = Thread_telecharge()
Th.start()

comme vous le voyer il sagit du même code que le premier mais avec les partie concernant l'interface graphique grisé.

2 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
18 août 2010 à 16:43
Bonjour.
Étrange comme problème !
Avec l'interface graphique, le thread de téléchargement est peut-être défavorisé par rapport au thread gérant l'affichage de la fenêtre.
0
aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 18
23 août 2010 à 10:37
Je vais y regarder mais j'aime bien ton idée de programme.
________
Aéra
0
Rejoignez-nous