def __init__(self, cheminVideoEntre, valeurNum=0, cheminMEncoder=None): QDialog.__init__(self) # === Paramètres généraux ===# self.repTampon = EkdConfig.getTempDir() + os.sep # Répertoire de sauvegarde ds le rep tampon self.rep_video_ext_resol = self.repTampon + "video_extension_resol" + os.sep # Uniquement pour Linux et MacOSX if os.name in ["posix", "mac"] or not cheminMEncoder: self.cheminMEncoder = u"mencoder" # Uniquement pour windows elif os.name == "nt" and cheminMEncoder: self.cheminMEncoder = unicode(cheminMEncoder) # chemin(s) des vidéos chargées self.cheminVideoEntre = cheminVideoEntre # valeur de la boite de spin pour l'encodage self.valeurNum = valeurNum self.fichiers = [os.path.basename(parc) for parc in self.cheminVideoEntre] # Appel de la fonction lanceur self.lanceur()
def checkfirsttime(self,p) : #OK QT4 a, b, c, d = 0, 0, 0, 0 pathname = os.path.dirname (sys.argv[0]) refdir = os.path.abspath (pathname) + os.sep + u"videoporama" + os.sep + u"template" + os.sep if p=="o" : self.templatedir=unicode(QDir.homePath()) + os.sep + self.parent.configdir else : self.templatedir=refdir if (not os.path.exists(self.templatedir)) : print "Configuration directory doesn't exist" print "Create configuration directory at "+self.templatedir os.makedirs(self.templatedir) if (not os.path.exists(self.templatedir + os.sep + u"template_data.idv")) : d=1 reffile=open(refdir + os.sep +u"template_data.idv","r") destfile=open(self.templatedir + os.sep + u"template_data.idv","w") destfile.write(reffile.read()) destfile.close() ### check or create temporary dir self.T = EkdConfig.getTempDir() + os.sep + u"videoporamatmp" if (not os.path.exists(self.T)) : os.makedirs(self.T) if (c or d) : print "Configuration files not find (First time open ?)" if (a==c and b==d) : return False else : return True else : return False
def __init__(self, cheminVideoEntre, cheminFFmpeg=None): QThread.__init__(self) self.cancel = False #=== Paramètres généraux ===# self.repTampon = unicode(EkdConfig.getTempDir() + os.sep) # Répertoire de sauvegarde ds le rep tampon self.rep_audio = self.repTampon + u'concat_audio' + os.sep # Uniquement pour Linux et MacOSX if os.name in ['posix', 'mac'] or not cheminFFmpeg : self.cheminFFmpeg=u"ffmpeg" elif cheminFFmpeg : self.cheminFFmpeg=unicode(cheminFFmpeg) # Uniquement pour windows else : self.cheminFFmpeg=u"ffmpeg" # chemin(s) des vidéos chargées self.cheminVideoEntre = cheminVideoEntre
def __init__(self): # Identifiant de la classe self.idSection = "animation_encodage_web" # Pas d'"empilement" car pas de paramètre d'encodage self.stacked = None # ------------------------------------------------------------------- # # Chemin des répertoires temporaires pour la gestion des fichiers # mod (extension .mod). Ce sont (apparemment) des fichiers mpeg avec # une extension .mod. Les fichiers en question ont juste besoin # d'être renommés avec une extension .mpg avant le traitement. # ------------------------------------------------------------------- # self.repTempEntree = EkdConfig.getTempDir() + os.sep # création des répertoires temporaires if os.path.isdir(self.repTempEntree) is False: os.makedirs(self.repTempEntree) # Chemin exact d'écriture pour le tampon des fichiers mod self.repTempFichiersMod = self.repTempEntree + "transcodage" + os.sep + "fichiers_mod" + os.sep # Création du chemin if os.path.isdir(self.repTempFichiersMod) is False: os.makedirs(self.repTempFichiersMod) # Epuration/elimination des fichiers tampon contenus dans le rep tampon for toutRepTemp in glob.glob(self.repTempFichiersMod + "*.*"): os.remove(toutRepTemp) # ---------------------------------------------------------------------------------- # Paramètres de la liste de combo: [(identifiant, nom entrée, instance, extension), ...] # ---------------------------------------------------------------------------------- self.listeCombo = [ ("youtube_16/9_HQ", _(u"Transcodage YouTube 16/9 Haute Qualité"), 0, ".avi"), ("youtube_16/9_MQ", _(u"Transcodage YouTube 16/9 Moyenne Qualité"), 1, ".avi"), ("youtube_16/9_LQ", _(u"Transcodage YouTube 16/9 Basse qualité"), 2, ".avi"), ("youtube_4/3_HQ", _(u"Transcodage YouTube 4/3 Haute Qualité"), 3, ".avi"), ("youtube_4/3_MQ", _(u"Transcodage YouTube 4/3 Moyenne Qualité"), 4, ".avi"), ("youtube_4/3_LQ", _(u"Transcodage YouTube 4/3 Basse qualité"), 5, ".avi"), ("google_video_16/9_HQ", _(u"Transcodage Google vidéo 16/9 Haute qualité"), 6, ".avi"), ("google_video_16/9_MQ", _(u"Transcodage Google vidéo 16/9 Qualité moyenne"), 7, ".avi"), ("google_video_16/9_LQ", _(u"Transcodage Google vidéo 16/9 Basse qualité"), 8, ".avi"), ("google_video_4/3_HQ", _(u"Transcodage Google vidéo 4/3 Haute qualité"), 9, ".avi"), ("google_video_4/3_MQ", _(u"Transcodage Google vidéo 4/3 Qualité moyenne"), 10, ".avi"), ("google_video_4/3_LQ", _(u"Transcodage Google vidéo 4/3 Basse qualité"), 11, ".avi"), ("dailymotion_sd_4/3", _(u"Transcodage Dailymotion SD 4/3"), 12, ".mp4"), ("dailymotion_sd_16/9", _(u"Transcodage Dailymotion SD 16/9"), 13, ".mp4"), ("dailymotion_HD720p", _(u"Transcodage Dailymotion HD720p"), 14, ".mp4"), ] # --------------------------- # Dérivation de la classe # --------------------------- Base_EncodageFiltre.__init__(self, titre=_(u"Transcodage: Pour le Web"))
def __init__(self, statusBar, parent=None): vbox=QVBoxLayout() #=== Variable de configuration ===# self.config=EkdConfig # Identifiant de la classe self.idSection = "animation_montage_video_et_audio" super(Animation_MontagVideoVidPlusAudio, self).__init__(boite='vbox', titre=_(u"Montage: Vidéo et audio")) self.printSection() self.repTampon = EkdConfig.getTempDir() + os.sep if os.path.isdir(self.repTampon) is False: os.makedirs(self.repTampon) # Au cas où le répertoire existait déjà et qu'il n'était pas vide -> purge (simple précaution) for toutRepCompo in glob.glob(self.repTampon+'*.*'): os.remove(toutRepCompo) # Liste de fichiers initiaux (contenu dans le fichier de configuration) self.lstFichiersSource = [] self.lstFichiersSourceProv = [] # idem mais provisoire (sert à récupérer les chemins dans l'ordre de sélection) self.lstFichiersSourceAudio = [] self.lstFichiersSourceProvAudio = [] # Par soucis de lisibilité, on préfère ne pas utiliser des objets présent dans le parent de cette façon # mais plutôt le passer en paramètre (le code est plus facile à lire de cette façon) self.statusBar = statusBar #------------------------------------------------------------------- self.afficheurVideoSource=SelectWidget(extensions = ["*.avi", "*.mpg", "*.mpeg", "*.mjpeg", "*.flv", "*.mp4", "*.h264", "*.dv", "*.vob"], mode="texte", video = True) ################################################################################### # Onglets self.indexVideoSource = self.add(self.afficheurVideoSource, _(u'Video(s) source')) self.connect(self.afficheurVideoSource,SIGNAL("fileSelected"),self.getFile) self.connect(self.afficheurVideoSource, SIGNAL("pictureChanged(int)"), self.getFile) #-------------------------------------------------------------------- # ------------------------------------------------------------------- # Boîte de groupe : "Fichiers source" # ------------------------------------------------------------------- extFormat=[] for fmt in parent.soxSuppFormat : extFormat.append("*."+fmt) self.afficheurAudioSource=SelectWidget(extensions=extFormat ,mode="texte", audio = True) # Onglets self.indexAudioSource = self.add(self.afficheurAudioSource, _(u'Audio(s) source')) self.connect(self.afficheurAudioSource,SIGNAL("fileSelected"), self.getFileA) self.connect(self.afficheurAudioSource, SIGNAL("pictureChanged(int)"), self.getFileA) ## --------------------------------------------------------------------- # Variables pour la fonction tampon ## --------------------------------------------------------------------- self.typeEntree = ["video","audio"] # Défini le type de fichier source. self.typeSortie = "video" # Défini le type de fichier de sortie. self.sourceEntrees = [self.afficheurVideoSource, self.afficheurAudioSource] # Fait le lien avec le sélecteur de fichier source. self.addReglage("vbox") #=== Widget qui seront inclus dans la boite de réglage ===# self.ordreVideo = selectJoinMultipleSound(0, self) self.ordreVideo.setTitleAndTips(_(u"Fichiers vidéos à joindre"), _(u"Liste des fichiers vidéo à joindre. <b>Pour information, vous pouvez monter et descendre les fichiers grâce aux flèches haut et bas (les fichiers apparaissant en haut de la liste sont ceux qui seront au début du montage)</b>")) self.ordreAudio = selectJoinMultipleSound(0, self) self.ordreAudio.setTitleAndTips(_(u"Fichiers audios à joindre"), _(u"Liste des fichiers audio à joindre. <b>Pour information, vous pouvez monter et descendre les fichiers grâce aux flèches haut et bas (les fichiers apparaissant en haut de la liste sont ceux qui seront au début du montage)</b>")) self.layoutReglage.addWidget(self.ordreVideo) self.layoutReglage.addWidget(self.ordreAudio) # --------------------------- # Boite de groupe de mplayer # --------------------------- self.addPreview() self.addLog()
def demarrerEncodeur(self, encodeur): """démarrage de mencoder avec les arguments choisis""" if self.estLancee == False: # pas question de démarrer 2 fois l'encodage commande = None has_audio = False debug('\n') # Si la conversion d'images en vidéo est sélectionné, aucune # info Mplayer n'est affichée (problème de récup infos par Mplayer) if self.idCodec in ['mpeg1video', 'mjpeg', 'h263p', 'mpeg4', 'msmpeg4v2', 'ljpeg', 'dv', 'huffyuv', 'mov', 'flv', 'mp4', 'vob']: # ICI SI LES FICHIERS CHARGES SONT DES IMAGES a = "###############################" b = "# Informations sur les images :" c = "###############################" infos = '\n'+a+'\n'+b+'\n'+c+'\n' debug(infos) self.zoneTexte.append(infos) import glob # Le chemin pour l'affichage des infos sur les images ne fonctionnait # plus après la nouvelle structure des fichiers temporaires self.recupTempImgAnim = glob.glob(EkdConfig.getTempDir() + os.sep + "*.*") self.recupTempImgAnim.sort() # Affichage du chemin (temp) + le poids de chaque image # --> Une énumération de parcours a été introduite for parcNb, parcInfIm in enumerate(self.recupTempImgAnim): debug('* '+str(parcNb+1)+'. '+parcInfIm+' --> '+str(float(os.path.getsize(parcInfIm)/1000))+' ko'+'\n') self.zoneTexte.append('* '+str(parcNb+1)+'. '+parcInfIm+' --> '+str(float(os.path.getsize(parcInfIm)/1000))+' ko'+'\n') # Elimination de la dernière image de la liste car car elle # s'affiche en double ds la fenêtre information de l'encodage # et aussi ds la console #self.log = self.log[:len(self.log)-1] # On définie la longueur de la futur vidéo en divisant le nombre d'image par le # nombre d'image par seconde (valeurNum ici) self.ffmpegProcess.setVideoLen(len(self.recupTempImgAnim) / int(self.valeurNum)) # Pour les traitements autres que la transformation des images en vidéo if self.idCodec not in ['mpeg1video', 'mjpeg', 'h263p', 'mpeg4', 'msmpeg4v2', 'ljpeg', 'dv', 'huffyuv', 'mov', 'flv', 'mp4', 'vob']: a = "########################" b = "# Informations MPlayer :" c = "########################" infos = '\n'+a+'\n'+b+'\n'+c+'\n' debug(infos) ######## Ajouté le 24/07/09 ################################################################## # Utilisation de la classe infovideo (et en particilier la fonction setVideo) # présents dans gui_modules_animation/infoVideo.py info = infovideo(self.cheminVideoEntre) id_filename = 'ID_FILENAME='+self.cheminVideoEntre+'\n' debug(id_filename) id_demuxer = 'ID_DEMUXER='+info.demux+'\n' debug(id_demuxer) id_video_format = 'ID_VIDEO_FORMAT='+info.videoFormat+'\n' debug(id_video_format) id_video_codec = 'ID_VIDEO_CODEC='+info.video_codec+'\n' debug(id_video_codec) id_video_bitrate = 'ID_VIDEO_BITRATE='+str(info.videoBitrate)+'\n' debug(id_video_bitrate) id_video_largeur = 'ID_VIDEO_WIDTH='+str(info.videoLargeur)+'\n' debug(id_video_largeur) id_video_hauteur = 'ID_VIDEO_HEIGHT='+str(info.videoHauteur)+'\n' debug(id_video_hauteur) id_img_par_sec = 'ID_VIDEO_FPS='+str(info.imgParSec)+'\n' debug(id_img_par_sec) ##### Donnée très importante pour la suite du calcul (pour ffmpeg.py et ffmpeg2theora) #### self.dureeTotaleVideo = float(info.dureeTotaleVideo) ########################################################################################### id_duree_totale_video = 'ID_LENGTH='+str(info.dureeTotaleVideo)+'\n' debug(id_duree_totale_video) id_audio_codec = 'ID_AUDIO_CODEC='+info.audioCodec+'\n' debug(id_audio_codec) id_audio_rate = 'ID_AUDIO_RATE='+str(info.audioRate)+'\n' debug(id_audio_rate) id_audio_bitrate = 'ID_AUDIO_BITRATE='+str(info.audioBitrate)+'\n' debug(id_audio_bitrate) self.zoneTexte.append(infos+id_filename+id_demuxer+id_video_format+id_video_codec+id_video_bitrate+id_video_largeur+id_video_hauteur+id_img_par_sec+id_duree_totale_video+id_audio_codec+id_audio_rate+id_audio_bitrate) ############################################################################################## ## On définie la longueur de la vidéo pour le process self.ffmpegProcess.setVideoLen(self.dureeTotaleVideo) if info.audioCodec : has_audio = True debug('\n') a = "############################" b = "# Informations %s :" %encodeur c = "############################" infos = '\n'+a+'\n'+b+'\n'+c+'\n' debug(infos) self.zoneTexte.append(infos) if self.idCodec=='codec_dv_ffmpeg': self.ffmpegProcess.commandeFfmpegEncodageDv() elif self.idCodec=='codec_mov_ffmpeg': #### Enlevé le 09/04/11 ############################## #self.ffmpegProcess.commandeFfmpegEncodageMov() ###################################################### #### Ajouté/rectifié le 09/04/11 ##################### self.ffmpegProcess.commandeFfmpegEncodageMov(comp = self.valeurNum[0], size = self.valeurNum[1]) ###################################################### elif self.idCodec=='codec_hfyu_ffmpeg': #### Enlevé le 10/04/11 ############################## #self.ffmpegProcess.commandeFfmpegEncodageHfyu(audio = has_audio) ###################################################### #### Ajouté/rectifié le 10/04/11 ##################### self.ffmpegProcess.commandeFfmpegEncodageHfyu(size = self.valeurNum, audio = has_audio) ###################################################### elif self.idCodec=='codec_vob_ffmpeg': self.ffmpegProcess.commandeFfmpegEncodageVob(vquantizer = self.valeurNum) elif self.idCodec=='codec_3GP_ffmpeg': #### Enlevé le 30/03/11 ############################## #self.ffmpegProcess.commandeFfmpegEncodage3gp(audio = has_audio) #### Ajouté/rectifié le 30/03/11 ##################### self.ffmpegProcess.commandeFfmpegEncodage3gp(size = self.valeurNum) ###################################################### elif self.idCodec=='codec_AMV_ffmpeg': #### Rectifié le 30/03/11 ## Ajout de size ########### self.ffmpegProcess.commandeFfmpegEncodageAMV(size = self.valeurNum) ###################################################### elif self.idCodec=='idx': self.ffmpegProcess.commandeFfmpegNbrImgSec(rate = self.valeurNum) elif self.idCodec in ['mpeg1video', 'mjpeg', 'h263p', 'mpeg4', 'msmpeg4v2', 'ljpeg', 'dv', 'huffyuv', 'mov', 'flv', 'mp4', 'vob']: self.ffmpegProcess.commandeFfmpegConvertImg(rate = self.valeurNum, size = "%sx%s" % (self.tailleIm[0], self.tailleIm[1]), vcodec = self.idCodec) # --------------------------------------------------------------------------------- # # Traitement pour chaque entrée concernant la HD (classique, en dehors du codec Avid DNxHD) # --------------------------------------------------------------------------------- # elif self.idCodec in ['hd_1920x1080_mov__pcm_s16be__16/9', 'hd_1280x720_mov__pcm_s16be__16/9', 'hd_1440x1080_mov__pcm_s16be__4/3']: ## FIXME : La taille est récupérée du nom de idCodec (crade) self.ffmpegProcess.commandeFfmpegConvHD(size = self.idCodec.split("_")[1]) ### Ajouté le 19/08/10 (Gestion du codec Avid DNxHD) ################################ # --------------------------------------------------------------------------------- # # Traitement pour chaque entrée (24) concernant le codec Avid DNxHD pour la HD # --------------------------------------------------------------------------------- # elif self.idCodec=='hd_dnxhd_1920x1080_29.97_220_mbs': ## FIXME : Les éléments utiles sont récupérés du nom de idCodec (crade mais utile) self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 1 elif self.idCodec=='hd_dnxhd_1920x1080_29.97_145_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 2 elif self.idCodec=='hd_dnxhd_1920x1080_25_185_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 3 elif self.idCodec=='hd_dnxhd_1920x1080_25_120_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 4 elif self.idCodec=='hd_dnxhd_1920x1080_25_36_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 5 elif self.idCodec=='hd_dnxhd_1920x1080_24_175_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 6 elif self.idCodec=='hd_dnxhd_1920x1080_24_115_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 7 elif self.idCodec=='hd_dnxhd_1920x1080_24_36_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 8 elif self.idCodec=='hd_dnxhd_1920x1080_23.976_175_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 9 elif self.idCodec=='hd_dnxhd_1920x1080_23.976_115_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 10 elif self.idCodec=='hd_dnxhd_1920x1080_23.976_36_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 11 elif self.idCodec=='hd_dnxhd_1920x1080_29.97_220_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 12 elif self.idCodec=='hd_dnxhd_1920x1080_29.97_145_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 13 elif self.idCodec=='hd_dnxhd_1920x1080_29.97_45_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 14 elif self.idCodec=='hd_dnxhd_1280x720_59.94_220_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 15 elif self.idCodec=='hd_dnxhd_1280x720_59.94_145_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 16 elif self.idCodec=='hd_dnxhd_1280x720_50_175_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 17 elif self.idCodec=='hd_dnxhd_1280x720_50_115_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 18 elif self.idCodec=='hd_dnxhd_1280x720_29.97_110_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 19 elif self.idCodec=='hd_dnxhd_1280x720_29.97_75_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 20 elif self.idCodec=='hd_dnxhd_1280x720_25_90_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 21 elif self.idCodec=='hd_dnxhd_1280x720_25_60_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 22 elif self.idCodec=='hd_dnxhd_1280x720_23.976_90_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 23 elif self.idCodec=='hd_dnxhd_1280x720_23.976_60_mbs': self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 24 ################################################################################# elif self.idCodec=='jpeg': # convertir animation en images self.ffmpegProcess.commandeFfmpegConvAnimImg() elif self.idCodec=='extractionaudio': self.ffmpegProcess.commandeFfmpegSeparation() elif self.idCodec=='encodage_wav': # encodage de fichiers audio en wav self.ffmpegProcess.commandeFfmpegEncodageWav() elif self.idCodec=='conv_en_16_9_ou_4_3': # Convertir vidéo en 16/9 ou 4/3 self.ffmpegProcess.commandeFfmpegConv_16_9_ou_4_3( ext = os.path.splitext(self.cheminVideoEntre)[1], size = "%sx%s" % (self.tailleVideo[0], self.tailleVideo[1]), aspect = self.valeurNum, audio = has_audio) # Remonté d'un niveau pour simplifier le code et éviter les répetitions if commande == None: commande = self.ffmpegProcess.command else : self.ffmpegProcess.command = commande debug(commande) self.zoneTexte.append(commande+'\n\n') self.ffmpegProcess.start() debug(u"Commande lancée") self.estLancee = True
def __init__(self, statusBar): # ------------------------------- # Parametres généraux du widget # ------------------------------- #=== tout sera mis dans une boîte verticale ===# vbox=QVBoxLayout() #=== Variable de configuration ===# self.config=EkdConfig # Identifiant de la classe self.idSection = "animation_montage_video_seul" super(Animation_MontagVideoVidSeul, self).__init__(boite='vbox', titre=_(u"Montage: Vidéo seulement")) self.printSection() # Création des répertoires temporaires self.repTampon = EkdConfig.getTempDir() + os.sep if os.path.isdir(self.repTampon) is False: os.makedirs(self.repTampon) # Au cas où le répertoire existait déjà et qu'il n'était pas vide -> purge (simple précausion) for toutRepCompo in glob.glob(self.repTampon+'*.*'): os.remove(toutRepCompo) # Liste de fichiers initiaux (contenu dans le fichier de configuration) self.lstFichiersSource = [] self.lstFichiersSourceProv = [] # idem mais provisoire (sert à récupérer les chemins dans l'ordre de sélection) self.statusBar = statusBar #------------------------------------------------------------------- self.afficheurVideoSource=SelectWidget(extensions = ["*.avi", "*.mpg", "*.mpeg", "*.mjpeg", "*.flv", "*.mp4", "*.h264", "*.dv", "*.vob"], mode="texte", video = True) ## --------------------------------------------------------------------- # Variables pour la fonction tampon ## --------------------------------------------------------------------- self.typeEntree = "video" # Défini le type de fichier source. self.typeSortie = "video" # Défini le type de fichier de sortie. self.sourceEntrees = self.afficheurVideoSource # Fait le lien avec le sélecteur de fichier source. ##################################################################### # Onglets self.indexVideoSource = self.add(self.afficheurVideoSource, _(u'Video(s) source')) self.connect(self.afficheurVideoSource,SIGNAL("fileSelected"),self.getFile) self.connect(self.afficheurVideoSource, SIGNAL("pictureChanged(int)"), self.getFile) #-------------------------------------------------------------------- self.addReglage(boite="vbox") #-------------------------------------------------------------------- #=== Widget qui seront inclus dans la boite de réglage ===# self.ordreVideo = selectJoinMultipleSound(0, self) self.ordreVideo.setTitleAndTips(_(u"Fichiers vidéos à joindre"), _(u"Liste des fichiers vidéo à joindre. <b>Pour information, vous pouvez monter et descendre les fichiers grâce aux flèches haut et bas (les fichiers apparaissant en haut de la liste sont ceux qui seront au début du montage)</b>")) self.layoutReglage.addWidget(self.ordreVideo) # ---------------------------- # Boite de groupe de mplayer # ---------------------------- self.addPreview() self.addLog()
def __init__(self, geometry): QWidget.__init__(self) # Boite d'alignement vertical vbox=QVBoxLayout(self) #=== Création des répertoires temporaires ===# # Gestion du repertoire tmp avec EkdConfig self.repTampon = EkdConfig.getTempDir() + os.sep + "tampon" + os.sep + "image_divers_renommage" + os.sep if os.path.isdir(self.repTampon) is False: os.makedirs(self.repTampon) # Au cas où le répertoire existait déjà et qu'il n'était pas vide # -> purge (simple précausion) for toutRepCompo in glob.glob(self.repTampon+'*.*'): os.remove(toutRepCompo) #=== Drapeaux ===# # Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai) # Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées) self.modifImageSource = 0 #=== Variable de configuration ===# # Fonctions communes à plusieurs cadres du module Image self.base = Base() # Gestion de la configuration via EkdConfig # Paramètres de configuration self.config = EkdConfig # Identifiant du cadre self.idSection = "image_renommer" # Log du terminal self.base.printSection(self.idSection) # Fonction appelant la fenêtre principale self.mainWindowFrameGeometry = geometry self.listeImgSource = [] # là où s'afficheront les infos self.zoneTexte = QTextEdit("") if PYQT_VERSION_STR < "4.1.0": self.zoneTexte.setText = self.zoneTexte.setPlainText self.zoneTexte.setReadOnly(True) self.tabwidget=QTabWidget() # Boîte de combo self.comboClassement=QComboBox() self.listeComboClassement=[(_(u'Par ordre de sélection'), 'ord_select'),\ (_(u'Par ordre alpha-numérique'), 'ord_apha_num'),\ (_(u'Par ordre de prise de vue (données Exif): ordre croissant'), 'ord_exif_oc'),\ (_(u'Par ordre de prise de vue (données Exif): ordre décroissant'), 'ord_exif_dc')] # Insertion de l'ordre de classement des images/photos dans la combo box for i in self.listeComboClassement: self.comboClassement.addItem(i[0],QVariant(i[1])) self.connect(self.comboClassement, SIGNAL("currentIndexChanged(int)"), self.classement) #=== 1er onglet ===# self.framNbreImg=QFrame() vboxReglage=QVBoxLayout(self.framNbreImg) self.grid = QGridLayout() self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0) self.spin1=SpinSlider(1, 10000, 1, '', self) self.grid.addWidget(self.spin1, 0, 1) self.connect(self.spin1, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0) self.spin2=SpinSlider(3, 18, 6, '', self) self.grid.addWidget(self.spin2, 1, 1) self.connect(self.spin2, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) # Demandé par Marc de la liste lprod # "J'aurais été interressé par un paramètre supplémentaire pour définir l'incrément (ou le pas ...). # En fait cela permettrait d'insérer (donc classer) facilement les photos issues d'appareils # différents mais traitant les mêmes sujets. En fait, je voudrais réaliser une série finale des # photos prises avec mon APN, mon camescope et l'APN de mon épouse. Je numérote de 10 en 10 la # plus grosse série de photos et viens insérer les autres au bon endroit sans avoir à utiliser # des indices a, b, c, etc." self.grid.addWidget(QLabel(_(u"Valeur d'incrément (passage d'une image à l'autre)")), 2, 0) #self.spin3=SpinSlider(1, 1000, 1, 'increment', self) # Ne fonctionne pas self.spin3=SpinSlider(1, 1000, 1, '', self) self.grid.addWidget(self.spin3, 2, 1) self.connect(self.spin3, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.addWidget(QLabel(_(u"Classement")), 3, 0) self.grid.addWidget(self.comboClassement, 3, 1) self.grid.setAlignment(Qt.AlignHCenter) vboxReglage.addLayout(self.grid) vboxReglage.addStretch() #=== 2ème onglet ===# # infos - logs self.zoneAffichInfosImg = QTextEdit("") if PYQT_VERSION_STR < "4.1.0": self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText self.zoneAffichInfosImg.setReadOnly(True) self.framImg=QFrame() vboxReglage=QVBoxLayout(self.framImg) vboxReglage.addWidget(self.zoneAffichInfosImg) self.framImg.setEnabled(False) # Là où s'afficheront les images self.afficheurImgSource=SelectWidget(geometrie = self.mainWindowFrameGeometry) ## --------------------------------------------------------------------- # Variables pour la fonction tampon ## --------------------------------------------------------------------- self.typeEntree = "image" # Défini le type de fichier source. self.typeSortie = "image" # Défini le type de fichier de sortie. self.sourceEntrees = self.afficheurImgSource # Fait le lien avec le sélecteur de fichier source. self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source')) self.indexTabReglage=self.tabwidget.addTab(self.framNbreImg, _(u'Réglages')) self.indexTabInfo=self.tabwidget.addTab(self.framImg, _(u'Infos')) vbox.addWidget(self.tabwidget) # ------------------------------------------------------------------- # widgets du bas : ligne + boutons Aide et Appliquer # ------------------------------------------------------------------- # Boutons boutAidetRenomImg=QPushButton(_(u" Aide")) boutAidetRenomImg.setIcon(QIcon("Icones/icone_aide_128.png")) self.connect(boutAidetRenomImg, SIGNAL("clicked()"), self.afficherAide) self.boutApp=QPushButton(_(u" Renommer")) self.boutApp.setIcon(QIcon("Icones/icone_appliquer_128.png")) self.connect(self.boutApp, SIGNAL("clicked()"), self.appliquer) # Ligne de séparation juste au dessus des boutons ligne = QFrame() ligne.setFrameShape(QFrame.HLine) ligne.setFrameShadow(QFrame.Sunken) vbox.addWidget(ligne) vbox.addSpacing(-5) # la ligne doit être plus près des boutons hbox=QHBoxLayout() hbox.addWidget(boutAidetRenomImg) hbox.addStretch() # espace entre les 2 boutons hbox.addWidget(self.boutApp) self.boutApp.setEnabled(False) vbox.addLayout(hbox) # Affichage de la boîte principale self.setLayout(vbox) #---------------------------------------------------------------------------------------------------- # Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action #---------------------------------------------------------------------------------------------------- self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction)
def __init__(self, statusBar, geometry): QWidget.__init__(self) # ------------------------------- # Parametres généraux du widget # ------------------------------- #=== tout sera mis dans une boîte verticale ===# vbox=QVBoxLayout(self) #=== Création des répertoires temporaires ===# # Utilisation de EkdConfig self.repTampon = EkdConfig.getTempDir() + os.sep if os.path.isdir(self.repTampon) is False: os.makedirs(self.repTampon) # Au cas où le répertoire existait déjà et qu'il n'était pas vide # -> purge (simple précausion) for toutRepCompo in glob.glob(self.repTampon+'*.*'): os.remove(toutRepCompo) #=== Drapeaux ===# # Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai) # Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées? # Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image self.conversionImg = 0 # Est-ce qu'une prévisualisation a été appelée? self.previsualImg = 0 # Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées) self.modifImageSource = 0 # Délai avant conversion self.timer = QTimer() self.connect(self.timer, SIGNAL('timeout()'), self.sonderTempsActuel) # Fonctions communes à plusieurs cadres du module Image self.base = Base() # Gestion de la configuration via EkdConfig # Paramètres de configuration self.config = EkdConfig # Identifiant du cadre self.idSection = "image_changer_format" # Log du terminal self.base.printSection(self.idSection) # Fonction appelant la fenêtre principale self.mainWindowFrameGeometry = geometry self.listeImgSource = [] self.listeImgDestin = [] #------------------------ # Onglets et stacked #------------------------ self.tabwidget=QTabWidget() #=== 1er onglet ===# self.framReglage=QFrame() vboxReglage=QVBoxLayout(self.framReglage) # boite de combo self.comboReglage=QComboBox() self.listeComboReglage=[(_(u'JPEG (.jpg)'), '.jpg'),\ (_(u'JPEG (.jpeg)'), '.jpeg'),\ (_(u'PNG (.png)'), '.png'),\ (_(u'GIF (.gif)'), '.gif'),\ (_(u'BMP (.bmp)'), '.bmp'),\ (_(u'PPM (.ppm)'), '.ppm'),\ (_(u'TIFF (.tiff)'), '.tiff'),\ (_(u'TIF (.tif)'), '.tif')] # Se trouve directement dans l'onglet Réglages self.grid = QGridLayout() self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0) self.spin1=SpinSlider(1, 100000, 1, '', self) self.grid.addWidget(self.spin1, 0, 1) self.connect(self.spin1, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0) self.spin2=SpinSlider(3, 18, 6, '', self) self.grid.addWidget(self.spin2, 1, 1) self.connect(self.spin2, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.setAlignment(Qt.AlignHCenter) vboxReglage.addLayout(self.grid) vboxReglage.addStretch() # Insertion des formats dans la combo box for i in self.listeComboReglage: self.comboReglage.addItem(i[0],QVariant(i[1])) self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage) # Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration self.base.valeurComboIni(self.comboReglage, self.config, self.idSection, 'format') self.grid2 = QGridLayout() # Label qualité pour la qualité (compression) lors de la sauvegarde en JPEG self.labQualite=QLabel(_(u"Qualité")) self.labQualite.hide() self.grid2.addWidget(QLabel(_(u'Type de format après traitement')), 0, 0) self.grid2.addWidget(self.comboReglage, 0, 1) self.grid2.addWidget(self.labQualite, 2, 0) # Réglage de la qualité pour la qualité (compression) lors de la sauvegarde en JPEG self.spin3=SpinSlider(1, 100, 75, '', self) self.spin3.hide() i = self.comboReglage.currentIndex() idCombo=str(self.comboReglage.itemData(i).toStringList()[0]) if idCombo in ['.jpg', '.jpeg']: self.labQualite.show() self.spin3.show() else: self.labQualite.hide() self.spin3.hide() self.grid2.addWidget(self.spin3, 2, 1) self.connect(self.spin3, SIGNAL("valueChanged(int)"), self.changeQualitePourJPEG) self.grid2.setAlignment(Qt.AlignHCenter) vboxReglage.addLayout(self.grid2) vboxReglage.addStretch() #=== 2ème onglet ===# # infos - logs self.zoneAffichInfosImg = QTextEdit("") if PYQT_VERSION_STR < "4.1.0": self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText self.zoneAffichInfosImg.setReadOnly(True) self.framImg=QFrame() vboxReglage=QVBoxLayout(self.framImg) vboxReglage.addWidget(self.zoneAffichInfosImg) self.framImg.setEnabled(False) # ------------------------------------------------- # Onglets d'affichage image source et destination # ------------------------------------------------- # Là où s'afficheront les images self.afficheurImgSource=SelectWidget(geometrie = geometry) self.afficheurImgDestination=Lecture_VisionImage(statusBar) self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source')) self.indexTabReglage=self.tabwidget.addTab(self.framReglage, _(u'Réglages')) self.indexTabImgDestin=self.tabwidget.addTab(self.afficheurImgDestination, _(u'Image(s) après traitement')) self.indexTabInfo=self.tabwidget.addTab(self.framImg, _(u'Infos')) vbox.addWidget(self.tabwidget) ## --------------------------------------------------------------------- # Variables pour la fonction tampon ## --------------------------------------------------------------------- self.typeEntree = "image" # Défini le type de fichier source. self.typeSortie = "image" # Défini le type de fichier de sortie. self.sourceEntrees = self.afficheurImgSource # Fait le lien avec le sélecteur de fichier source. #------------------ # Widgets du bas #------------------ # boutons boutAide=QPushButton(_(u" Aide")) boutAide.setIcon(QIcon("Icones/icone_aide_128.png")) boutAide.setFocusPolicy(Qt.NoFocus) self.connect(boutAide, SIGNAL("clicked()"), self.afficherAide) self.boutApPremImg = QPushButton(_(u" Voir le résultat")) self.boutApPremImg.setIcon(QIcon("Icones/icone_visionner_128.png")) self.boutApPremImg.setFocusPolicy(Qt.NoFocus) self.boutApPremImg.setEnabled(False) self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_img) self.boutApp=QPushButton(_(u" Appliquer")) self.boutApp.setIcon(QIcon("Icones/icone_appliquer_128.png")) self.boutApp.setFocusPolicy(Qt.NoFocus) self.boutApp.setEnabled(False) self.connect(self.boutApp, SIGNAL("clicked()"), self.appliquer0) # Ligne de séparation juste au dessus des boutons ligne = QFrame() ligne.setFrameShape(QFrame.HLine) ligne.setFrameShadow(QFrame.Sunken) vbox.addWidget(ligne) vbox.addSpacing(-5) # la ligne doit être plus près des boutons hbox=QHBoxLayout() hbox.addWidget(boutAide) hbox.addStretch() # espace entre les 2 boutons hbox.addWidget(self.boutApPremImg) hbox.addStretch() hbox.addWidget(self.boutApp) vbox.addLayout(hbox) self.setLayout(vbox) #------------------------------------------------ # Barre de progression dans une fenêtre séparée #------------------------------------------------ self.progress=QProgressDialog(_(u"Progression ..."), _(u"Arrêter le processus"), 0, 100) self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur. Fenêtre de progression')) # Attribution des nouvelles dimensions self.progress.setMinimumWidth(500) self.progress.setMinimumHeight(100) self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab) #---------------------------------------------------------------------------------------------------- # Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action #---------------------------------------------------------------------------------------------------- self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction) #---------------------------------------------------------------------------------------------------- # Signal pour afficher ou ne pas afficher les widgets de changement de qualité pour les images #---------------------------------------------------------------------------------------------------- self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerQualJPEG)
def __init__(self): #=== Identifiant de la classe ===# self.idSection = "animation_encodage_general" # ------------------------------------------------------------------- # # Chemin des répertoires temporaires pour la gestion des fichiers # mod (extension .mod). Ce sont (apparemment) des fichiers mpeg avec # une extension .mod. Les fichiers en question ont juste besoin # d'être renommés avec une extension .mpg avant le traitement. # ------------------------------------------------------------------- # self.repTempEntree = EkdConfig.getTempDir() + os.sep # création des répertoires temporaires if os.path.isdir(self.repTempEntree) is False: os.makedirs(self.repTempEntree) # Chemin exact d'écriture pour le tampon des fichiers mod self.repTempFichiersMod = self.repTempEntree+'transcodage'+os.sep+'fichiers_mod'+os.sep # Création du chemin if os.path.isdir(self.repTempFichiersMod) is False: os.makedirs(self.repTempFichiersMod) # Epuration/elimination des fichiers tampon contenus dans le rep tampon for toutRepTemp in glob.glob(self.repTempFichiersMod+'*.*'): os.remove(toutRepTemp) # ------------------------------------------------------------------- # Widgets intégrés à la boîte de groupe "Réglage de sortie de l'encodage". # La boîte de combo définie ci-dessus 'sélectionne' ceux qui vont s'afficher # -> utilisation d'un stacked # ------------------------------------------------------------------- # === Widgets associés au codecs: Copie (format original) - AVI-RAW Sans # Compression - Codec XVID - Qualite SVCD - Qualite DVD - Codec H264 MPEG 4 # création de stacked pour les QWidget self.stacked=QStackedWidget() self.stacked.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed)) self.itemStacked_sansReglages=Codecs_SansReglages() # par défaut self.indexStacked_sansReglages=self.stacked.addWidget(self.itemStacked_sansReglages) # === Widgets associés aux codecs qui possèdent des réglages (itemStacked) self.itemStacked_AVI_RAW=Codecs_AvecReglages('avirawsanscompression', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_HFYU=Codecs_AvecReglages('avirawsanscompression', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_DIVX4=Codecs_AvecReglages('codecdivx4', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_XVID=Codecs_AvecReglages('codecxvid', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_JPEG=Codecs_AvecReglages('codecmotionjpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_MPEG1=Codecs_AvecReglages('codecmpeg1', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_MPEG2=Codecs_AvecReglages('codecmpeg2', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_WMV2=Codecs_AvecReglages('codecwmv2', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_VOB=Codecs_AvecReglages('codec_vob_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_flash=Codecs_AvecReglages('macromediaflashvideo', min_range_1=1 , max_range_1=100, min_range_2=10, max_range_2=5000, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_oggTheora=Codecs_AvecReglages('codecoggtheora', min_range_1=0 , max_range_1=10, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_mpeg4_h264=Codecs_AvecReglages('codech264mpeg4', min_range_1=800 , max_range_1=2800, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_mpeg4_h264_ext_h264=Codecs_AvecReglages('codech264mpeg4_ext_h264', min_range_1=800 , max_range_1=2800, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_3GP=Codecs_AvecReglages('codec_3GP_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_AMV=Codecs_AvecReglages('codec_AMV_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) self.itemStacked_MOV=Codecs_AvecReglages('codec_mov_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : ")) # === Widgets associés aux codecs qui possèdent des réglages (indexStacked) self.indexStacked_AVI_RAW=self.stacked.addWidget(self.itemStacked_AVI_RAW) self.indexStacked_HFYU=self.stacked.addWidget(self.itemStacked_HFYU) self.indexStacked_DIVX4=self.stacked.addWidget(self.itemStacked_DIVX4) self.indexStacked_XVID=self.stacked.addWidget(self.itemStacked_XVID) self.indexStacked_JPEG=self.stacked.addWidget(self.itemStacked_JPEG) self.indexStacked_MPEG1=self.stacked.addWidget(self.itemStacked_MPEG1) self.indexStacked_MPEG2=self.stacked.addWidget(self.itemStacked_MPEG2) self.indexStacked_WMV2=self.stacked.addWidget(self.itemStacked_WMV2) self.indexStacked_VOB=self.stacked.addWidget(self.itemStacked_VOB) self.indexStacked_flash=self.stacked.addWidget(self.itemStacked_flash) self.indexStacked_oggTheora=self.stacked.addWidget(self.itemStacked_oggTheora) self.indexStacked_mpeg4_h264=self.stacked.addWidget(self.itemStacked_mpeg4_h264) self.indexStacked_mpeg4_h264_ext_h264=self.stacked.addWidget(self.itemStacked_mpeg4_h264_ext_h264) self.indexStacked_3GP=self.stacked.addWidget(self.itemStacked_3GP) self.indexStacked_AMV=self.stacked.addWidget(self.itemStacked_AMV) self.indexStacked_MOV=self.stacked.addWidget(self.itemStacked_MOV) #---------------------------------------------------------------------------------- # Paramètres de la liste de combo: [(identifiant, nom entrée, index du stacked, # instance stacked, extension fichier sortie, valeur spin à récupérer?),...] #---------------------------------------------------------------------------------- self.listeCombo = [\ ('copie', _(u'Copie (format original)'), self.indexStacked_sansReglages,\ self.itemStacked_sansReglages, '', 0),\ ('avirawsanscompression',_(u'AVI-RAW i420 (sans compression) (.avi)'), self.indexStacked_AVI_RAW,\ self.itemStacked_AVI_RAW, '.avi', 1),\ ('codec_dv_ffmpeg',_(u'Codec DV (.dv)'), self.indexStacked_sansReglages,\ self.itemStacked_sansReglages, '.dv', 0),\ ('codec_mov_ffmpeg',_(u'Codec QuickTime MOV (.mov)'), self.indexStacked_MOV,\ self.itemStacked_MOV, '.mov', 1),\ ('codec_hfyu_ffmpeg',_(u'Codec HFYU: Huffman Lossless YUV (yuv422p) (.avi)'), self.indexStacked_HFYU,\ self.itemStacked_HFYU, '.avi', 1),\ ('codecmotionjpeg', _(u'Codec Motion JPEG (.avi)'), self.indexStacked_JPEG,\ self.itemStacked_JPEG, '.avi', 1),\ ('codecoggtheora', _(u'Codec OGG THEORA (.ogg)'), self.indexStacked_oggTheora,\ self.itemStacked_oggTheora, '.ogg', 1),\ ('codec_vob_ffmpeg',_(u'Codec VOB (DVD-Video stream MPEG-2) (.vob)'), self.indexStacked_VOB,\ self.itemStacked_VOB, '.vob', 1),\ ('codecmpeg2', _(u'Codec MPEG 2 (.mpg)'), self.indexStacked_MPEG2,\ self.itemStacked_MPEG2, '.mpg', 1),\ ('codech264mpeg4', _(u'Codec H264 MPEG 4 (.mp4)'), self.indexStacked_mpeg4_h264,\ self.itemStacked_mpeg4_h264, '.mp4', 1),\ ('codech264mpeg4_ext_h264', _(u'Codec H264 MPEG 4 (.h264)'), self.indexStacked_mpeg4_h264_ext_h264,\ self.itemStacked_mpeg4_h264_ext_h264, '.h264', 1),\ ('codecxvid', _(u'Codec XVID (.avi)'), self.indexStacked_XVID,\ self.itemStacked_XVID, '.avi', 1),\ ('codecdivx4', _(u'Codec DIVX4 (.avi)'), self.indexStacked_DIVX4,\ self.itemStacked_DIVX4, '.avi', 1),\ ('codecmpeg1', _(u'Codec MPEG 1 (.mpg)'), self.indexStacked_MPEG1,\ self.itemStacked_MPEG1, '.mpg', 1),\ ('macromediaflashvideo',_(u'Macromedia Flash Video (.flv)'), self.indexStacked_flash,\ self.itemStacked_flash, '.flv', 1),\ ('codecwmv2', _(u'Codec WMV2 (.wmv)'), self.indexStacked_WMV2,\ self.itemStacked_WMV2, '.wmv', 1),\ ('codec_3GP_ffmpeg',_(u'Codec 3GP (3rd Generation Partnership Project) (.3gp)'), self.indexStacked_3GP,\ self.itemStacked_3GP, '.3gp', 1),\ ('codec_AMV_ffmpeg', _(u'Codec AMV: pour lecteurs mp4 (.avi)'), self.indexStacked_AMV,\ self.itemStacked_AMV, '.avi', 1),\ ] #--------------------------- # Dérivation de la classe #--------------------------- super(Animation_Encodage_General, self).__init__(_(u"Transcodage: Général"))
def __init__(self, statusBar, geometry): QWidget.__init__(self) # ---------------------------- # Quelques paramètres de base # ---------------------------- # Paramètres de configuration self.config = EkdConfig # Fonctions communes à plusieurs cadres du module Image self.base = Base() self.idSection = "image_image_composite" # Log du terminal self.base.printSection(self.idSection) # Fonction appelant la fenêtre principale self.mainWindowFrameGeometry = geometry # Création des répertoires temporaires. Utilisation de EkdConfig self.repTampon = EkdConfig.getTempDir() + os.sep + "tampon" + os.sep + "temp_duplication" + os.sep if os.path.isdir(self.repTampon) is False: os.makedirs(self.repTampon) # Au cas où le répertoire existait déjà et qu'il n'était pas vide # -> purge (simple précausion) for toutRepCompo in glob.glob(self.repTampon+'*.*'): os.remove(toutRepCompo) # Répertoire tampon dans lequel est crée le compositing qui sera crée par le # bouton 'Voir le résultat'. Utilisation de EkdConfig self.repTamponVisuVoirRes = self.repTampon + "visu_voir_res_compo" + os.sep if os.path.isdir(self.repTamponVisuVoirRes) is False: os.makedirs(self.repTamponVisuVoirRes) # Au cas où le répertoire existait déjà et qu'il n'était pas vide # -> purge (simple précausion) for toutRepCompoVisu in glob.glob(self.repTamponVisuVoirRes+'*.*'): os.remove(toutRepCompoVisu) # Répertoire temporaire 1 pour les redimensionnement des images if os.path.isdir(self.repTampon+'redim_1/') is False: os.makedirs(self.repTampon+'redim_1/') # Répertoire temporaire 2 pour les redimensionnement des images if os.path.isdir(self.repTampon+'redim_2/') is False: os.makedirs(self.repTampon+'redim_2/') # Au cas où le répertoire existait déjà et qu'il n'était pas vide # -> purge (simple précausion) for toutRepCompoRedim in glob.glob(self.repTampon+'redim_1/'+'*.*'): if len(toutRepCompoRedim)>0: os.remove(toutRepCompoRedim) # ... for toutRepCompoRedim in glob.glob(self.repTampon+'redim_2/'+'*.*'): if len(toutRepCompoRedim)>0: os.remove(toutRepCompoRedim) #=== Drapeaux ===# # Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai) # Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées? # Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image self.conversionImg = 0 # Est-ce qu'une prévisualisation a été appelée? self.previsualImg = 0 # Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées) self.modifImageSource = 0 # Liste de chemins de fichiers avec et sans canal alpha et du dossier de sauvegarde self.listeChemAVcanAlph=[] self.listeChemSANScanAlph=[] self.listeImgDestin = [] # Boite d'alignement vertical vbox=QVBoxLayout(self) # -------------------------------------------------- # widgets du haut : titre + bouton de sélection # -------------------------------------------------- hbox = QHBoxLayout() # Ajout du titre de la page et de l'aperçu à la boite verticale vbox.addLayout(hbox, 0) #=== Bouton de sélection des images alpha et sans alpha ===# hbox = QHBoxLayout() self.framReglage=QFrame() vboxReglage=QVBoxLayout(self.framReglage) # Pour la gestion du nombre d'images à traiter ############## self.grid = QGridLayout() self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0) self.spin1=SpinSlider(1, 100000, 1, '', self) self.grid.addWidget(self.spin1, 0, 1) self.connect(self.spin1, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0) self.spin2=SpinSlider(3, 18, 6, '', self) self.grid.addWidget(self.spin2, 1, 1) self.connect(self.spin2, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.setAlignment(Qt.AlignHCenter) vboxReglage.addLayout(self.grid) vboxReglage.addStretch() # ------------------------------------------------- # Onglets d'affichage image source et destination # ------------------------------------------------- # On peut sélectionner les extensions qui doivent être visibles comme ceci: #self.afficheurImgSource=SelectWidget(extensions=["*.jpg", "*.png"], geometrie = self.mainWindowFrameGeometry) # Là uniquement les fichiers png et gif apparaissent ds la fenêtre de chargement # Ne pas oublier de mettre * avant le point et l'extension # Là où s'afficheront les images # Avec canal alpha self.afficheurImgSourceAvecCanalAlpha=SelectWidget(extensions=["*.png", "*.gif"], geometrie = self.mainWindowFrameGeometry) # Sans canal alpha self.afficheurImgSourceSansCanalAlpha=SelectWidget(geometrie = self.mainWindowFrameGeometry) # Gestion de la configuration via EkdConfig # Résultat du compositing self.afficheurImgDestination=Lecture_VisionImage(statusBar) ## --------------------------------------------------------------------- # Variables pour la fonction tampon ## --------------------------------------------------------------------- self.typeEntree = "image" # Défini le type de fichier source. self.typeSortie = "image" # Défini le type de fichier de sortie. self.sourceEntrees = self.afficheurImgSourceSansCanalAlpha # Fait le lien avec le sélecteur de fichier source. ### Remarque : Le choix a été fait de ne pas mettre la boîte de sélection des images alpha dans le tampon. # infos - logs self.zoneAffichInfosImg = QTextEdit("") if PYQT_VERSION_STR < "4.1.0": self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText self.zoneAffichInfosImg.setReadOnly(True) self.fram=QFrame() vboxInfIm=QVBoxLayout(self.fram) vboxInfIm.addWidget(self.zoneAffichInfosImg) self.fram.setEnabled(False) self.tabwidget=QTabWidget() self.indexTabImgSourceAvCanAlph = self.tabwidget.addTab(self.afficheurImgSourceAvecCanalAlpha, _(u'Image(s) avec canal alpha')) self.indexTabImgSourceSansCanAlph = self.tabwidget.addTab(self.afficheurImgSourceSansCanalAlpha, _(u'Image(s) sans canal alpha')) self.indexTabReglage=self.tabwidget.addTab(self.framReglage, _(u'Réglages')) self.indexTabImgDestin=self.tabwidget.addTab(self.afficheurImgDestination, _(u'Image(s) après traitement')) self.indexTabInfo=self.tabwidget.addTab(self.fram, _(u'Infos')) vbox.addWidget(self.tabwidget) # ------------------------------------------------------------------- # widgets du bas : ligne + boutons # ------------------------------------------------------------------- # boutons boutAide=QPushButton(_(u" Aide")) boutAide.setIcon(QIcon("Icones/icone_aide_128.png")) self.connect(boutAide, SIGNAL("clicked()"), self.afficherAide) self.boutApPremImg = QPushButton(_(u" Voir le résultat")) self.boutApPremImg.setIcon(QIcon("Icones/icone_visionner_128.png")) self.boutApPremImg.setFocusPolicy(Qt.NoFocus) self.boutApPremImg.setEnabled(False) self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_derniere_img) self.boutAppliquer=QPushButton(_(u" Appliquer et sauver")) self.boutAppliquer.setIcon(QIcon("Icones/icone_appliquer_128.png")) self.boutAppliquer.setEnabled(False) self.connect(self.boutAppliquer, SIGNAL("clicked()"), self.appliquer) # ligne de séparation juste au dessus des boutons ligne = QFrame() ligne.setFrameShape(QFrame.HLine) ligne.setFrameShadow(QFrame.Sunken) vbox.addWidget(ligne) vbox.addSpacing(-5) # la ligne doit être plus près des boutons hbox=QHBoxLayout() hbox.addWidget(boutAide) hbox.addStretch() # espace entre les 2 boutons hbox.addWidget(self.boutApPremImg) hbox.addStretch() hbox.addWidget(self.boutAppliquer) vbox.addLayout(hbox) # affichage de la boîte principale self.setLayout(vbox) self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab) #---------------------------------------------------------------------------------------------------- # Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action #---------------------------------------------------------------------------------------------------- self.connect(self.afficheurImgSourceSansCanalAlpha, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction)
def __init__(self, statusBar, geometry): QWidget.__init__(self) # ---------------------------- # Quelques paramètres de base # ---------------------------- #=== Création des répertoires temporaires ===# # Gestion du repertoire tmp avec EkdConfig self.repTampon = EkdConfig.getTempDir() + os.sep + "tampon" + os.sep + "image_divers_redimensionner" + os.sep if os.path.isdir(self.repTampon) is False: os.makedirs(self.repTampon) if os.path.isdir(self.repTampon+'redim'+os.sep) is False: os.makedirs(self.repTampon+'redim'+os.sep) # Si le répertoire /tmp/ekd/tampon/image_divers_redimensionner/redim # n'est pas vide, il est expressément vidé de tout son contenu tempr=glob.glob(self.repTampon+'redim'+os.sep+'*.*') if len(tempr)>0: for parc in tempr: os.remove(parc) #=== Variable contenant les titres du log ===# self.infosImgTitre = [] txt = _(u"Image(s) chargée(s)") a='#'*36 b = a + '\n# ' + txt + '\n' + a + '\n' txt=_(u"Image(s) convertie(s)") c = a + '\n# ' + txt + '\n' + a + '\n' self.infosImgTitre.append(b) self.infosImgTitre.append(c) #=== Drapeaux ===# # Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai) # Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées? # Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image self.conversionImg = 0 # Est-ce qu'une prévisualisation a été appelée? self.previsualImg = 0 # Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées) self.modifImageSource = 0 # Identifiant des filtres utilisant partiellement ou intégralement un module python durant # la conversion self.filtresPython=['redim_avec_ratio', 'redim_sans_ratio'] self.timer = QTimer() self.connect(self.timer, SIGNAL('timeout()'), self.sonderTempsActuel) self.process = QProcess() self.connect(self.process, SIGNAL('finished(int)'), self.finConversion) # Fonctions communes à plusieurs cadres du module Image self.base = Base() # Gestion de la configuration via EkdConfig # Paramètres de configuration self.config = EkdConfig # Identifiant du cadre self.idSection = "image_redimensionner" # Log du terminal self.base.printSection(self.idSection) # Fonction appelant la fenêtre principale self.mainWindowFrameGeometry = geometry self.listeImgSource = [] self.listeImgDestin = [] # Boite d'alignement vertical vbox=QVBoxLayout(self) # ---------------------------------------- # Bouton de sélection des images sources # ---------------------------------------- self.tabwidget=QTabWidget() # Rq: le signal est placé à la fin de __init__ à cause d'une bizarrerie sous qt4.4 #------------------ # Onglet Réglages #------------------ self.framReglage=QFrame() vboxReglage=QVBoxLayout(self.framReglage) # Gestion du nombre d'images à traiter self.grid = QGridLayout() self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0) self.spin1_ImTrait=SpinSlider(1, 100000, 1, '', self) self.grid.addWidget(self.spin1_ImTrait, 0, 1) self.connect(self.spin1_ImTrait, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0) self.spin2_ImTrait=SpinSlider(3, 18, 6, '', self) self.grid.addWidget(self.spin2_ImTrait, 1, 1) self.connect(self.spin2_ImTrait, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1) self.grid.setAlignment(Qt.AlignHCenter) vboxReglage.addLayout(self.grid) vboxReglage.addStretch() #=== Stacked ===# self.stacked = QStackedWidget() self.stacked.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed)) #=== Instanciation des widgets du stacked ===# # Widgets du stacked avec une seule boite de spin self.stacked_redim_avec_ratio = SpinSliders(self, 10,6000,640, _(u"nouvelle largeur"), 'largeur_ratio') # Widgets du stacked avec 2 boites de spin self.stacked_redim_sans_ratio = SpinSliders(self, 10,6000,640,_(u"nouvelle largeur"),'largeur_sans_ratio', 10,6000,480, _(u"nouvelle hauteur"), 'longueur_sans_ratio') # Ajout des widgets aux stacked indexStacked_redim_avec_ratio = self.stacked.addWidget(self.stacked_redim_avec_ratio) indexStacked_redim_sans_ratio = self.stacked.addWidget(self.stacked_redim_sans_ratio) #=== Autres widgets de l'onglet réglagle ===# #---- boite de combo self.comboReglage=QComboBox() # Paramètres de la liste de combo: [(nom entrée, identifiant, index du stacked, # instance stacked),...] self.listeComboReglage=[\ (_(u'Redimensionner en tenant compte des proportions'), 'redim_avec_ratio', indexStacked_redim_avec_ratio, self.stacked_redim_avec_ratio), (_(u'Redimensionner sans tenir compte des proportions'), 'redim_sans_ratio', indexStacked_redim_sans_ratio, self.stacked_redim_sans_ratio)] # Insertion des codecs de compression dans la boite de combo for i in self.listeComboReglage: self.comboReglage.addItem(i[0], QVariant(i[1])) self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage) # Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration self.base.valeurComboIni(self.comboReglage, self.config, self.idSection, 'methode') self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerApercu) #---- Pseudo-aperçu de la redimension self.apercu = Apercu((400, 300), statusBar) self.connect(self.stacked_redim_avec_ratio.spin, SIGNAL("valueChanged(int)"), self.changerApercu) self.connect(self.stacked_redim_sans_ratio.spin1, SIGNAL("valueChanged(int)"), self.changerApercu) self.connect(self.stacked_redim_sans_ratio.spin2, SIGNAL("valueChanged(int)"), self.changerApercu) # On donne les valeurs de largeur et hauteur des images converties à l'aperçu self.changerApercu() # Légende de l'aperçu coulSource, coulConvert = self.apercu.couleurContourSourceConvert() self.legendeSource = ElementLegende(": " +\ _(u"Contours des images sources (taille la plus fréquente en foncé)"), coulSource) self.legendeConvert = ElementLegende(": "+ _(u"Contours des images à convertir"), coulConvert) self.legendeSource.hide() self.legendeConvert.hide() #=== Mise-en-page ===# hbox = QHBoxLayout() hbox.addWidget(QLabel(_(u'Type'))) hbox.addWidget(self.comboReglage) hbox.setAlignment(Qt.AlignHCenter) vboxReglage.addLayout(hbox) vboxReglage.addWidget(self.stacked) hboxApercu = QHBoxLayout() hboxApercu.addStretch() hboxApercu.addWidget(self.apercu) hboxApercu.addStretch() vboxReglage.addLayout(hboxApercu) vboxReglage.addWidget(self.legendeSource) vboxReglage.addWidget(self.legendeConvert) vboxReglage.addStretch() #---------------- # Onglet de log #---------------- self.zoneAffichInfosImg = QTextEdit("") if PYQT_VERSION_STR < "4.1.0": self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText self.zoneAffichInfosImg.setReadOnly(True) self.framInfos=QFrame() vboxInfIm=QVBoxLayout(self.framInfos) vboxInfIm.addWidget(self.zoneAffichInfosImg) # ------------------------------------------------- # Onglets d'affichage image source et destination # ------------------------------------------------- # Là où s'afficheront les images self.afficheurImgSource=SelectWidget(geometrie = self.mainWindowFrameGeometry) # Gestion de la configuration via EkdConfig self.afficheurImgDestination=Lecture_VisionImage(statusBar) ## --------------------------------------------------------------------- # Variables pour la fonction tampon ## --------------------------------------------------------------------- self.typeEntree = "image" # Défini le type de fichier source. self.typeSortie = "image" # Défini le type de fichier de sortie. self.sourceEntrees = self.afficheurImgSource # Fait le lien avec le sélecteur de fichier source. vbox.addWidget(self.tabwidget) self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source')) self.indexTabReglage=self.tabwidget.addTab(self.framReglage, _(u'Réglages')) self.indexTabImgDestin = self.tabwidget.addTab(self.afficheurImgDestination, _(u'Image(s) après traitement')) self.indexTabInfo=self.tabwidget.addTab(self.framInfos, _(u'Infos')) # ------------------------------------------- # widgets du bas : curseur + ligne + boutons # ------------------------------------------- # Boutons boutAide=QPushButton(_(u" Aide")) boutAide.setIcon(QIcon("Icones/icone_aide_128.png")) self.connect(boutAide, SIGNAL("clicked()"), self.afficherAide) self.boutApPremImg = QPushButton(_(u" Voir le résultat")) self.boutApPremImg.setIcon(QIcon("Icones/icone_visionner_128.png")) self.boutApPremImg.setFocusPolicy(Qt.NoFocus) # Bouton inactif au départ self.boutApPremImg.setEnabled(False) self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_derniere_img) self.boutAppliquer=QPushButton(_(u" Appliquer et sauver")) self.boutAppliquer.setIcon(QIcon("Icones/icone_appliquer_128.png")) # Bouton inactif au départ self.boutAppliquer.setEnabled(False) self.connect(self.boutAppliquer, SIGNAL("clicked()"), self.appliquer0) # Ligne de séparation juste au dessus des boutons ligne = QFrame() ligne.setFrameShape(QFrame.HLine) ligne.setFrameShadow(QFrame.Sunken) vbox.addWidget(ligne) vbox.addSpacing(-5) # la ligne doit être plus près des boutons hbox=QHBoxLayout() hbox.addWidget(boutAide) hbox.addStretch() hbox.addWidget(self.boutApPremImg) hbox.addStretch() hbox.addWidget(self.boutAppliquer) vbox.addLayout(hbox) #----------------------------- # Barre de progression #----------------------------- self.progress=QProgressDialog(_(u"Conversion en cours..."), _(u"Arrêter"), 0, 100) self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur. Fenêtre de progression')) self.progress.setMinimumWidth(500) self.progress.setMinimumHeight(100) self.connect(self.progress, SIGNAL("canceled()"), self.arretProgression) # affichage de la boîte principale self.setLayout(vbox) self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab) #---------------------------------------------------------------------------------------------------- # Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action #---------------------------------------------------------------------------------------------------- self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifImgSource)