diff options
| author | Debulois Quentin <quentin.debulois@gmail.com> | 2020-09-20 20:57:56 +0200 |
|---|---|---|
| committer | Debulois Quentin <quentin.debulois@gmail.com> | 2020-09-20 20:57:56 +0200 |
| commit | 5248604f682789c736beada767405b4b14a44d86 (patch) | |
| tree | 8172cd8c93ef0edb3c0dd711932e90280c128274 | |
| parent | 79e091c7c3796e6a4fd35ffb5b54b9e626954caa (diff) | |
Ajout des commentaires + pylint 10/10, hell yeah B)
| -rw-r--r-- | Redim/__pycache__/main.cpython-38.pyc | bin | 8337 -> 0 bytes | |||
| -rw-r--r-- | Redim/config.py | 35 | ||||
| -rw-r--r-- | Redim/core.py | 191 | ||||
| -rw-r--r-- | Redim/main.py | 68 | ||||
| -rw-r--r-- | Redim/ui.py | 77 |
5 files changed, 214 insertions, 157 deletions
diff --git a/Redim/__pycache__/main.cpython-38.pyc b/Redim/__pycache__/main.cpython-38.pyc Binary files differdeleted file mode 100644 index b759172..0000000 --- a/Redim/__pycache__/main.cpython-38.pyc +++ /dev/null diff --git a/Redim/config.py b/Redim/config.py index c6a6070..b0ea2ee 100644 --- a/Redim/config.py +++ b/Redim/config.py @@ -1,3 +1,7 @@ +"""Contient la gestion de l'enregistrement des choix de l'utilisateur +ainsi que la gestion de la supression des fichiers anciennement décompressés +par pyinstaller""" + from sys import platform from os import mkdir, listdir, environ, getenv from os.path import isdir, join, getmtime, isfile @@ -7,8 +11,9 @@ import json class Config(): + """Gestion de l'enregistrement des choix de l'utilisateur""" def __init__(self): - self._base_configuration = { + self.base_configuration = { "dimensions": [[500, 350], [900, 900]], "background": [255, 255, 255], "format_final": ".webp", @@ -34,21 +39,33 @@ class Config(): self.nettoyage_pyinstaller() def sauvegarde(self, configuration): + """Création du dossier de sauvegarde pour le fichier de configuration + et enregistrement des préférence de l'utilisateur + """ if not isdir(self.json_path): mkdir(self.json_path) - with open(join(self.json_path, "config"), "w") as f: - json.dump(configuration, f) + with open(join(self.json_path, "config"), "w") as file_config: + json.dump(configuration, file_config) print("\n[-] Modification enregistree.") def lecture(self): + """Return le contenu du fichier de configuration, si aucun fichier + n'éxiste, création d'un avec les valeurs par défaut + """ if not isfile(join(self.json_path, "config")): - self.sauvegarde(self._base_configuration) - return self._base_configuration - with open(join(self.json_path, "config"), "r") as f: - configuration = json.load(f) + self.sauvegarde(self.base_configuration) + return self.base_configuration + with open(join(self.json_path, "config"), "r") as file_config: + configuration = json.load(file_config) return configuration - def nettoyage_pyinstaller(self): + @staticmethod + def nettoyage_pyinstaller(): + """Supression des fichiers anciennement décompressés par pyinstaller""" for i in listdir(environ["TMP"]): - if i.startswith("_MEI") and isdir(i) and (int(getmtime(join(environ["TMP"], i))) < (time() - 86400)): + if i.startswith("_MEI")\ + and isdir(i)\ + and ( + int(getmtime(join(environ["TMP"], i))) + < (time() - 86400)): rmtree(join(environ["TMP"], i)) diff --git a/Redim/core.py b/Redim/core.py index 03d7f1c..d180305 100644 --- a/Redim/core.py +++ b/Redim/core.py @@ -1,3 +1,7 @@ +"""Contient la class principale de Redim, +travail sur les photos à l'aide de pillow +""" + from os import mkdir, listdir from os.path import isfile, isdir, join from PIL.Image import ANTIALIAS @@ -6,41 +10,33 @@ from PIL.Image import open as image_open class Redim(): + """Classe principale de Redim, travail sur les photos""" def __init__(self): - self.__charcters_indesirable = ( + self.__character_underscore = (" ", "-") + self.__character_indesirable = ( "(", ")", "[", "]", "{", "}", "'", "#", "¨", "&", "$", "£", "¤", "€", "`", "^", "°", "§", "@", "!", ",", "~", "%", ";", "µ" ) - self.__charcters_underscore = (" ", "-") self.__adverbes_multplicatifs = ( "_bis", "_ter", "_quater", "_quinquies", "_sexies", "_septies" ) - def start(self, dossier, configuration): - for i in range(len(configuration["dimensions"])): - print( - "\n[-] travail pour", - str(configuration["dimensions"][i][0]), - "x", - str(configuration["dimensions"][i][1]), - "px :" - ) - if dossier != "": - if isdir(dossier): - liste, destination = self.listage( - dossier, - str(configuration["dimensions"][i][0]), - configuration["formats_acceptes"] - ) - self.main(liste, destination, configuration, i) - else: - print(" >>>ERREUR<<< : Le dossier n'existe plus.") - else: - print(" >>>ERREUR<<< : Aucun dossier selectionne.") + def rennomage(self, origine_nom, larg, format_final): + """Formatage du nom en retirant tous ces charactères hideux""" + nouveau_nom = origine_nom + for i in self.__character_indesirable: + nouveau_nom = nouveau_nom.replace(i, "") + for i in self.__character_underscore: + nouveau_nom = nouveau_nom.replace(i, "_") + return nouveau_nom.lower() + "_modif_" + str(larg) + format_final - def listage(self, dossier, larg, formats_acceptes): + @staticmethod + def listage(dossier, larg, formats_acceptes): + """Listage des fichiers présent dans le dossier sélectionné, + return de la liste + du dossier ou seront enregistré les photos + """ liste = [] destination = join(dossier, str(larg)) if not isdir(destination): @@ -51,7 +47,9 @@ class Redim(): liste.append([join(dossier, nom), nom]) return liste, destination - def suppression_de_alpha(self, img, background): + @staticmethod + def suppression_de_alpha(img, background): + """Suppression de l'alpha (transparent) des photos""" img = img.convert("RGBA") if img.mode in ("RGBA", "LA"): fond = image_new(img.mode[:-1], img.size, background) @@ -60,7 +58,11 @@ class Redim(): img.convert("RGB") return img - def redimensionnement(self, img, larg, haut): + @staticmethod + def redimensionnement(img, larg, haut): + """Redimensionnement en agrandissant ou reduisant + pour coller aux dimensions finales + """ if (img.size[0] >= larg) or (img.size[1] >= haut): img.thumbnail((larg, haut), ANTIALIAS) elif (img.size[0] / img.size[1]) <= (larg / haut): @@ -71,70 +73,87 @@ class Redim(): img = img.resize((larg, nouvelle_haut), ANTIALIAS) return img - def rennomage(self, origine_nom, larg, format_final): - nouveau_nom = origine_nom - for i in self.__charcters_indesirable: - nouveau_nom = nouveau_nom.replace(i, "") - for i in self.__charcters_underscore: - nouveau_nom = nouveau_nom.replace(i, "_") - return nouveau_nom.lower() + "_modif_" + str(larg) + format_final - - def main(self, liste, destination, configuration, loop): - for nom in liste: - print(" [+] Travail sur :", nom[1]) - img = image_open(nom[0]) + def main(self, dossier, configuration): + """Fonction principale, execute toutes les method dans l'ordre + pour sauvegarder la photos aux bonnes dimensions, au bon format, + et sans alpha + """ + for loop in range(len(configuration["dimensions"])): print( - " >> Taille initiale :", - img.size[0], + "\n[-] travail pour", + str(configuration["dimensions"][loop][0]), "x", - img.size[1], - "px" + str(configuration["dimensions"][loop][1]), + "px :" ) - if nom[1].rsplit(".", 1)[-1] in ("png", "webp"): - img = self.suppression_de_alpha( + if dossier != "": + if isdir(dossier): + liste, destination = self.listage( + dossier, + str(configuration["dimensions"][loop][0]), + configuration["formats_acceptes"] + ) + else: + print(" >>>ERREUR<<< : Le dossier n'existe plus.") + else: + print(" >>>ERREUR<<< : Aucun dossier selectionne.") + for nom in liste: + print(" [+] Travail sur :", nom[1]) + img = image_open(nom[0]) + print( + " >> Taille initiale :", + img.size[0], + "x", + img.size[1], + "px" + ) + if nom[1].rsplit(".", 1)[-1] in ("png", "webp"): + img = self.suppression_de_alpha( + img, + configuration["background"] + ) + img = self.redimensionnement( img, - configuration["background"] + configuration["dimensions"][loop][0], + configuration["dimensions"][loop][1], ) - img = self.redimensionnement( - img, - configuration["dimensions"][loop][0], - configuration["dimensions"][loop][1], - ) - print( - " >> Taille apres redimensionnement :", - img.size[0], - "x", - img.size[1], - "px" - ) - nouveau_nom = self.rennomage( - nom[1].rsplit(".", 1)[0], - configuration["dimensions"][loop][0], - configuration["format_final"] - ) - fond = image_new( - "RGB", - ( + print( + " >> Taille apres redimensionnement :", + img.size[0], + "x", + img.size[1], + "px" + ) + nouveau_nom = self.rennomage( + nom[1].rsplit(".", 1)[0], configuration["dimensions"][loop][0], - configuration["dimensions"][loop][1] - ), - tuple(configuration["background"]) - ) - fond.paste( - img, - ( - (configuration["dimensions"][loop][0] - img.size[0]) // 2, - (configuration["dimensions"][loop][1] - img.size[1]) // 2 + configuration["format_final"] ) - ) - if isfile(join(destination, nouveau_nom)): - nom_deja_present = nouveau_nom - iteration = 0 - while isfile(join(destination, nom_deja_present)): - nom_deja_present = nouveau_nom.rsplit(".", 1)[0]\ - + self.__adverbes_multplicatifs[iteration] - nom_deja_present += configuration["format_final"] - iteration += 1 - fond.save(join(destination, nom_deja_present)) - else: - fond.save(join(destination, nouveau_nom)) + fond = image_new( + "RGB", + ( + configuration["dimensions"][loop][0], + configuration["dimensions"][loop][1] + ), + tuple(configuration["background"]) + ) + fond.paste( + img, + ( + (configuration["dimensions"][loop][0] + - img.size[0]) // 2, + (configuration["dimensions"][loop][1] + - img.size[1]) // 2 + ) + ) + if isfile(join(destination, nouveau_nom)): + nom_deja_present = nouveau_nom + iteration = 0 + while isfile(join(destination, nom_deja_present)): + nom_deja_present = nouveau_nom.rsplit(".", 1)[0]\ + + self.__adverbes_multplicatifs[iteration]\ + + configuration["format_final"] + iteration += 1 + fond.save(join(destination, nom_deja_present)) + else: + fond.save(join(destination, nouveau_nom)) diff --git a/Redim/main.py b/Redim/main.py index 31318e9..e66cc89 100644 --- a/Redim/main.py +++ b/Redim/main.py @@ -1,4 +1,6 @@ -from sys import exit +"""Fichier principal de Redim""" + +import sys from PyQt5.QtWidgets import QFileDialog, QWidget, QApplication from ui import Ui from core import Redim @@ -6,72 +8,68 @@ from config import Config def main(): + """Function principale de Redim, instanciation des classes + et exécution des choix de l'utilisateur dans le menu principal + """ app = QApplication([]) widget = QWidget() config = Config() redim = Redim() while True: configuration = config.lecture() - ui = Ui(configuration) - ui.reset_screen() - ui.affichage_banner() - ui.affichage_menu() + tui = Ui(configuration) + tui.affichage_banner() + tui.affichage_menu() choix = input( "[>] Choix (numero) : " ) while True: - ui.reset_screen() - ui.affichage_banner() + tui.affichage_banner() if choix.strip() == "1": dossier = QFileDialog.getExistingDirectory( widget, "Sélectionner le dossier sur lequel travailler." ) - redim.start(dossier, configuration) - ui.affichage_fin() + redim.main(dossier, configuration) + tui.affichage_fin() break - elif choix.strip() == "5": - ui.reset_screen() - ui.affichage_banner() - configuration["dimensions"] = ui.question_taille( + if choix.strip() == "5": + tui.affichage_banner() + configuration["dimensions"] = tui.question_taille( configuration["dimensions"] ) config.sauvegarde(configuration) - ui.affichage_fin() + tui.affichage_fin() break - elif choix.strip() == "6": - ui.reset_screen() - ui.affichage_banner() - configuration["background"] = ui.question_background( + if choix.strip() == "6": + tui.affichage_banner() + configuration["background"] = tui.question_background( configuration["background"] ) config.sauvegarde(configuration) - ui.affichage_fin() + tui.affichage_fin() break - elif choix.strip() == "7": - ui.reset_screen() - ui.affichage_banner() - configuration["format_final"] = ui.question_format_final( + if choix.strip() == "7": + tui.affichage_banner() + configuration["format_final"] = tui.question_format_final( configuration["formats_acceptes"] ) config.sauvegarde(configuration) - ui.affichage_fin() + tui.affichage_fin() break - elif choix.strip() == "8": - ui.reset_screen() - ui.affichage_banner() + if choix.strip() == "8": + tui.affichage_banner() print("\n[-] Reset des parametres.") - config.sauvegarde(config._base_configuration) - ui.affichage_fin() + config.sauvegarde(config.base_configuration) + tui.affichage_fin() break - elif choix.strip() == "9": - ui.reset_screen() - exit(0) + if choix.strip() == "9": + tui.reset_screen() + sys.exit(0) else: - ui.reset_screen() - ui.affichage_banner() + tui.affichage_banner() print("\n[-] Reponse invalide .") - ui.affichage_fin() + tui.affichage_fin() break diff --git a/Redim/ui.py b/Redim/ui.py index a5c5fc4..593ee81 100644 --- a/Redim/ui.py +++ b/Redim/ui.py @@ -1,8 +1,11 @@ +"""Contient toute la partie 'TUI' de Redim""" + from os import system from sys import platform class Ui: + """Gestion de l'interaction avec l'utilisateur""" def __init__(self, configuration): self.banner = ( "\n ____ _ ____ ____ \n", @@ -15,7 +18,7 @@ class Ui: ", ".join(map( str, ["x".join(map(str, configuration["dimensions"][i])) - for i in range(len(configuration["dimensions"]))] + for i in range(len(configuration["dimensions"]))] )) ), "\n[-] rgb background:", configuration["background"], @@ -34,36 +37,48 @@ class Ui: ) def affichage_banner(self): + """Reset de l'écran + affichage de la 'banner'""" + self.reset_screen() print(*self.banner) def affichage_menu(self): + """Affichage du menu principal""" print(*self.menu) - def question_taille(self, configuration): + @staticmethod + def question_taille(configuration): + """Récupère largeur & hauteur pour chaques tailles + enregistrées dans la configuration initiale + """ texte = [ - " [>] Largeur : ", - " [>] Hauteur : " + " [>] Largeur: ", + " [>] Hauteur: " ] tailles = [] for i in range(len(configuration)): print("\n[-] Taille {0!s}:".format(i + 1)) dimensions = [] - for j in range(len(texte)): + for j in texte: while True: - reponse = input(texte[j]) + reponse = input(j) try: reponse = int(reponse.strip()) - if reponse > 0: + if 5 < reponse < 5000: dimensions.append(reponse) break - else: - print(" >>>ERREUR<<< Valeur incorrecte.") - except: - print(" >>>ERREUR<<< Valeur incorrecte.") + print(" [ERREUR] La valeur trop petite" + " ou trop grande.") + except ValueError: + print(" [ERREUR] La valeur entree" + " n'est pas un chiffre.") tailles.append(dimensions) return tailles - def question_background(self, configuration): + @staticmethod + def question_background(configuration): + """Récupère 3 valeurs entre 0 & 255 pour la couleur qui servira + en remplissage si les photos sont redimensionnées ou avec alpha + """ texte = [ " [>] Valeur Rouge: ", " [>] Valeur Vert: ", @@ -79,18 +94,23 @@ class Ui: reponse = input(texte[i]) try: reponse = int(reponse.strip()) - if reponse >= 0 and reponse < 256: + if 0 <= reponse < 256: background.append(reponse) break - else: - print(" >>>ERREUR<<< Valeur incorrecte.") - except: - print(" >>>ERREUR<<< Valeur incorrecte.") + print(" [ERREUR] La valeur trop petite" + " ou trop grande.") + except ValueError: + print(" [ERREUR] La valeur entree" + " n'est pas un chiffre.") return background - def question_format_final(self, configuration): + @staticmethod + def question_format_final(configuration): + """Récupère le choix de sortie en fonction des formats + acceptés dans la configuration initiale + """ print("\n[-] Modification du format de sortie:\n") - for pos, i in enumerate(configuration): + for pos, i in enumerate(configuration[1:]): print( " (" + str(pos + 1) @@ -101,18 +121,21 @@ class Ui: reponse = input("\n[>] Choix (numero) : ") try: reponse = int(reponse.strip()) - if reponse > 0: - format_final = "." + configuration[reponse - 1] + if 0 < reponse <= len(configuration[1:]): + format_final = "." + configuration[reponse] return format_final - else: - print(">>>ERREUR<<< Choix invalide.") - except: - print(">>>ERREUR<<< Choix invalide.") + print("[ERREUR] Choix en dehors des possibilites.") + except ValueError: + print("[ERREUR] La valeur entree n'est pas un chiffre.") - def affichage_fin(self): + @staticmethod + def affichage_fin(): + """Bête appuye sur entrer pour continuer""" input("\n[-] fin, appuyer sur \'entrer\' pour continuer.") - def reset_screen(self): + @staticmethod + def reset_screen(): + """Reset de l'écran, cls pour CMD windows""" if platform != "linux": system("cls") else: |
