summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDebulois Quentin <quentin.debulois@gmail.com>2020-09-20 20:57:56 +0200
committerDebulois Quentin <quentin.debulois@gmail.com>2020-09-20 20:57:56 +0200
commit5248604f682789c736beada767405b4b14a44d86 (patch)
tree8172cd8c93ef0edb3c0dd711932e90280c128274
parent79e091c7c3796e6a4fd35ffb5b54b9e626954caa (diff)
Ajout des commentaires + pylint 10/10, hell yeah B)
-rw-r--r--Redim/__pycache__/main.cpython-38.pycbin8337 -> 0 bytes
-rw-r--r--Redim/config.py35
-rw-r--r--Redim/core.py191
-rw-r--r--Redim/main.py68
-rw-r--r--Redim/ui.py77
5 files changed, 214 insertions, 157 deletions
diff --git a/Redim/__pycache__/main.cpython-38.pyc b/Redim/__pycache__/main.cpython-38.pyc
deleted file mode 100644
index b759172..0000000
--- a/Redim/__pycache__/main.cpython-38.pyc
+++ /dev/null
Binary files differ
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: