├── La_liste_de_course ├── liste.json ├── README.md └── La_liste_de_course.py ├── Calculatrice ├── custom_ui │ ├── __init__.py │ ├── fenetrePrincipale.py │ └── fenetrePrincipale.ui ├── resultat.gif ├── README.md └── Calculatrice.py ├── Cookie_Clicker ├── nombreClique.json ├── cookie.ico ├── cookie.png ├── resultat.gif ├── README.md └── Cookie_Clicker.py ├── Trier_des_fichiers ├── Documents │ └── Facture.pdf ├── Images │ └── Tour_eiffel.jpg ├── Musiques │ └── Despacito.mp3 ├── Videos │ └── Court_metrage.mp4 ├── Inverse_trier_fichier.py ├── README.md └── Trier_des_fichiers.py ├── Fenetres_Infinies ├── resultat.gif ├── README.md └── app.py ├── Pyramide ├── Pyramide.py └── README.md ├── Trigonometrie_Mesure_Principale ├── README.md └── Trigonometrie_Mesure_Principale.py ├── Nombre_premier ├── README.md └── Nombre_premier.py ├── Fibonacci ├── README.md └── Fibonacci.py ├── Calcul_de_moyenne ├── README.md └── Calcul_de_moyenne.py ├── Nombre_mystere ├── README.md └── Nombre_mystere.py ├── Encodage_caractere ├── README.md └── Encodage_Caractere.py ├── Palindrome ├── README.md └── Palindrome.py ├── LICENSE ├── .gitignore ├── Mastermind ├── README.md └── Mastermind.py ├── CONTRIBUTING.md ├── README.md ├── HELP.md └── PythonChallenges.svg /La_liste_de_course/liste.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /Calculatrice/custom_ui/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Cookie_Clicker/nombreClique.json: -------------------------------------------------------------------------------- 1 | [0] -------------------------------------------------------------------------------- /Trier_des_fichiers/Documents/Facture.pdf: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Trier_des_fichiers/Images/Tour_eiffel.jpg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Trier_des_fichiers/Musiques/Despacito.mp3: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Trier_des_fichiers/Videos/Court_metrage.mp4: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Calculatrice/resultat.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theoludwig/PythonChallenges/HEAD/Calculatrice/resultat.gif -------------------------------------------------------------------------------- /Cookie_Clicker/cookie.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theoludwig/PythonChallenges/HEAD/Cookie_Clicker/cookie.ico -------------------------------------------------------------------------------- /Cookie_Clicker/cookie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theoludwig/PythonChallenges/HEAD/Cookie_Clicker/cookie.png -------------------------------------------------------------------------------- /Cookie_Clicker/resultat.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theoludwig/PythonChallenges/HEAD/Cookie_Clicker/resultat.gif -------------------------------------------------------------------------------- /Fenetres_Infinies/resultat.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theoludwig/PythonChallenges/HEAD/Fenetres_Infinies/resultat.gif -------------------------------------------------------------------------------- /Pyramide/Pyramide.py: -------------------------------------------------------------------------------- 1 | def dessinerPyramide(hauteur): 2 | nombresDeX = 1 3 | for iteration in range(hauteur): 4 | print(" " * (hauteur - iteration), "x" * nombresDeX) 5 | nombresDeX += 2 6 | 7 | try: 8 | hauteur = int(input("Hauteur de la pyramide : ")) 9 | dessinerPyramide(hauteur) 10 | except: 11 | print("Oups, il y a une erreur. \n") -------------------------------------------------------------------------------- /Trigonometrie_Mesure_Principale/README.md: -------------------------------------------------------------------------------- 1 | # Trigonométrie - Calculer la mesure principale 2 | 3 | ## Notions abordées 4 | 5 | - Boucle et Condition 6 | - La fonction abs() 7 | 8 | ## Énoncé 9 | 10 | Vous devez calculer la mesure principale d'un angle. 11 | 12 | On entre la valeur de l'angle sous la forme N/D*pi : 13 | 14 | ``` 15 | Numérateur : -246 16 | Dénominateur : 5 17 | ``` 18 | 19 | Python devra afficher : 20 | ``` 21 | La mesure principale est 4/5 π 22 | ``` 23 | -------------------------------------------------------------------------------- /Nombre_premier/README.md: -------------------------------------------------------------------------------- 1 | # Nombre Premier 2 | 3 | ## Notions abordées 4 | 5 | - Boucle, Condition 6 | - Modulo 7 | 8 | ## Énoncé 9 | 10 | Vous devez déterminer si le nombre entré par l'utilisateur est premier ou non. 11 | Un nombre premier est un entier naturel qui admet exactement deux diviseurs distincts entiers et positifs. (1 et lui-même). 12 | Exemple : 2, 3, 5, 7, 11, 13, 17, 19... 13 | 14 | Par exemple, si l'utilisateur rentre : 15 | ``` 16 | 4 17 | ``` 18 | 19 | Résultat : 20 | ``` 21 | 4 n'est pas un nombre premier. 22 | ``` 23 | -------------------------------------------------------------------------------- /Fibonacci/README.md: -------------------------------------------------------------------------------- 1 | # La suite de Fibonacci 2 | 3 | ## Notions abordées 4 | 5 | - Boucle 6 | - Liste 7 | 8 | ## Énoncé 9 | 10 | La suite de Fibonacci est une suite d'entiers dans laquelle chaque terme est la somme des deux termes qui le précèdent. Vous devez créer une fonction qui renvoie une liste contenant x nombres de la suite de Fibonacci, x est la valeur entrée par l'utilisateur. 11 | 12 | Par exemple, si l'utilisateur rentre : 13 | ```py 14 | compteur = 14 15 | ``` 16 | 17 | Résultat : 18 | ``` 19 | [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233] 20 | ``` -------------------------------------------------------------------------------- /Calcul_de_moyenne/README.md: -------------------------------------------------------------------------------- 1 | # Calcul de moyenne 2 | 3 | ## Notions abordées 4 | 5 | - Boucle 6 | - Liste 7 | 8 | ## Énoncé 9 | 10 | Vous devez calculer une moyenne de notes entrée par l'utilisateur. 11 | 12 | Donc imaginons que l'entrée de l'utilisateur se récupère dans une liste comme ceci : 13 | ```py 14 | nombres = input("Veuillez rentrer une liste de notes (séparées par virgules) : ").split(", ") 15 | ``` 16 | 17 | Par exemple, si l'utilisateur rentre : 18 | ``` 19 | 12, 16, 18, 6, 10 20 | ``` 21 | 22 | Résultat : 23 | ``` 24 | Moyenne de notes : 12.4 25 | ``` 26 | -------------------------------------------------------------------------------- /Nombre_mystere/README.md: -------------------------------------------------------------------------------- 1 | # Nombre mystère 2 | 3 | ## Notions abordées 4 | 5 | - Boucle et Condition 6 | - Module ```random``` 7 | 8 | ## Énoncé 9 | 10 | Vous devez générer, un "nombre mystère" aléatoirement entre 1 et 50 inclus que vous stockerez dans une variable. 11 | 12 | Puis vous demanderez à l'utilisateur d'essayer de deviner le nombre, si le nombre entré n'est pas le même que le nombre mystère alors vous affichez si le nombre mystère est plus petit ou plus grand du nombre entré, sachant que l'utilisateur a maximum 5 essais si il ne trouve pas le nombre après les 5 essais, le joueur aura perdu. 13 | -------------------------------------------------------------------------------- /Fibonacci/Fibonacci.py: -------------------------------------------------------------------------------- 1 | def fibonacci(compteur): 2 | a, b = 0, 1 3 | resultat = [] 4 | for _ in range(compteur): 5 | resultat.append(a) 6 | a, b = b, a+b 7 | return resultat 8 | 9 | try: 10 | compteur = int(input("Entrez le compteur de nombre : ")) 11 | print(fibonacci(compteur)) 12 | except: 13 | print("Oups, il y a une erreur. \n") 14 | 15 | """ 16 | Démonstration en 6 tours de boucle : combient vaut a et b à chaque itération (après l'ajout de a au résultat). 17 | a = 0 - b = 1 18 | a = 1 - b = 0+1 19 | a = 1 - b = 1+1 20 | a = 2 - b = 1+2 21 | a = 3 - b = 2+3 22 | a = 5 - b = 3+5 23 | """ -------------------------------------------------------------------------------- /Calcul_de_moyenne/Calcul_de_moyenne.py: -------------------------------------------------------------------------------- 1 | try: 2 | # Demande à l'utilisateur une liste de notes (exemple: 12, 16, 18, 6, 10) 3 | nombres = input("Veuillez rentrer une liste de notes (séparées par virgules) : ").split(", ") 4 | 5 | # Convertis chaque élément de la liste créé avec split() en float 6 | nombresListe = [float(x) for x in nombres] 7 | 8 | # Calcul et affichage du résultat de la moyenne des notes 9 | resultat = 0 10 | for element in nombresListe: 11 | resultat = resultat + element 12 | resultat = resultat / len(nombresListe) 13 | print("Moyenne de notes :", resultat) 14 | except: 15 | print("Oups, il y a une erreur. \n") -------------------------------------------------------------------------------- /Nombre_premier/Nombre_premier.py: -------------------------------------------------------------------------------- 1 | # Seulement les diviseurs non nul et positif 2 | def listeDiviseur(nombre): 3 | liste = [] 4 | # Boucle allant de 1 jusqu'au nombre inclu (range exclu ce nombre donc on fait + 1) 5 | for i in range(1, nombre + 1): 6 | if nombre % i == 0: 7 | liste.append(i) 8 | return liste 9 | 10 | def estPremier(nombre): 11 | return len(listeDiviseur(nombre)) == 2 12 | 13 | try: 14 | nombre = int(input("Veuillez rentré un nombre : ")) 15 | if estPremier(nombre): 16 | print(nombre, "est un nombre premier.") 17 | else: 18 | print(nombre, "n'est pas un nombre premier.") 19 | except: 20 | print("Oups, il y a une erreur. \n") -------------------------------------------------------------------------------- /Pyramide/README.md: -------------------------------------------------------------------------------- 1 | # Pyramide 2 | 3 | ## Notions abordées 4 | 5 | - Boucle et Fonction 6 | 7 | ## Énoncé 8 | 9 | Vous devez créer une fonction qui prend une hauteur en argument et qui affiche une pyramide en sortie. 10 | 11 | Exemple : 12 | ``` 13 | hauteur = 10 14 | ``` 15 | 16 | Résultat : 17 | ``` 18 | x 1 19 | xxx 3 20 | xxxxx 5 21 | xxxxxxx 7 22 | xxxxxxxxx 9 23 | xxxxxxxxxxx 11 24 | xxxxxxxxxxxxx 13 25 | xxxxxxxxxxxxxxx 15 26 | xxxxxxxxxxxxxxxxx 17 27 | xxxxxxxxxxxxxxxxxxx 19 28 | ``` 29 | -------------------------------------------------------------------------------- /Encodage_caractere/README.md: -------------------------------------------------------------------------------- 1 | # Encodage caractère 2 | 3 | ## Notions abordées 4 | 5 | - Condition 6 | - Fonctions utilisées : ```int(), hex(), bin()``` 7 | 8 | ## Énoncé 9 | 10 | Vous devez demander à l'utilisateur de choisir une option comme ceci : 11 | ```py 12 | affichage = """ 13 | Choisissez une option: 14 | \t1: Décimal en Binaire 15 | \t2: Binaire en Décimal 16 | \t3: Décimal en Hexadecimal 17 | \t4: Hexadecimal en Décimal 18 | \t5: Binaire en Hexadécimal 19 | \t6: Hexadécimal en Binaire 20 | """ 21 | ``` 22 | 23 | Puis vous devez pour chaque option calculer la conversion, convertir un nombre décimal en binaire, inversement, etc. 24 | 25 | __Exemple :__ 26 | Si l'utilisateur choisit la 1ère option et ensuite qu'il écrit 2, le programme devra afficher : 27 | ``` 28 | Décimal : 2 29 | Binaire : 10 30 | ``` 31 | -------------------------------------------------------------------------------- /Trier_des_fichiers/Inverse_trier_fichier.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | chemin = os.path.dirname(__file__) 5 | 6 | def inverseTrieFichier(chemin, cheminCourant = chemin): 7 | for fichier in os.listdir(cheminCourant): 8 | # Si le cheminCourant est un fichier (pas un dossier) 9 | if os.path.isfile(os.path.join(cheminCourant, fichier)): 10 | shutil.move(os.path.join(cheminCourant, fichier), os.path.join(chemin, fichier)) 11 | # Si le cheminCourant est un dossier (pas un fichier) 12 | elif os.path.isdir(os.path.join(cheminCourant, fichier)): 13 | inverseTrieFichier(chemin, os.path.join(cheminCourant, fichier)) 14 | else: 15 | exit() 16 | # Supprime les dossiers vides 17 | if cheminCourant != chemin: 18 | os.rmdir(cheminCourant) 19 | 20 | inverseTrieFichier(chemin) -------------------------------------------------------------------------------- /Fenetres_Infinies/README.md: -------------------------------------------------------------------------------- 1 | # Fenêtres Infinies 2 | 3 | ## Notions abordées 4 | 5 | - Condition, Boucle et Liste 6 | - Module ```PySide2``` (ou autres module pour créé des interfaces graphiques) 7 | 8 | ## Énoncé 9 | 10 | Vous devez créer une interface graphique avec un bouton, à chaque fois que l'utilisateur cliquera sur le bouton, une nouvelle fenêtre (la même) sera créé, puis en dessous du bouton figurera le nombre de fenêtres ouvertes en temps réel actualiser sur toutes les fenêtres ouvertes, ainsi si l'utilisateur ferme une fenêtre, actualise le nombre de fenêtres ouvertes. 11 | 12 | Résultat : 13 | 14 | ![Resultat](./resultat.gif) 15 | 16 | ## Solution 17 | 18 | Le code de la solution a été écrit sous Windows 10 avec Python v3.7.4. 19 | 20 | J'utilise la librairie PySide2 donc si vous voulez tester ma solution, il faudra installer ce module. 21 | 22 | ```pip install PySide2``` 23 | -------------------------------------------------------------------------------- /Trier_des_fichiers/README.md: -------------------------------------------------------------------------------- 1 | # Trier des fichiers 2 | 3 | ## Notions abordées 4 | 5 | - Boucle et Condition 6 | - Fonction (et récursivité) 7 | - Liste 8 | - Module ```os``` 9 | - Module ```shutil``` 10 | 11 | ## Énoncé 12 | 13 | Vous devez créer une fonction qui trie automatiquement des fichiers dans des sous-dossiers en fonction de leur type (et donc de leur extension). 14 | Facultatif : Réaliser la fonction inverse → déplacer les fichiers des sous-dossiers dans le dossier principale. 15 | 16 | Exemple : 17 | ``` 18 | ├── facture.pdf 19 | ├── Tour_eiffel.jpg 20 | ├── Logo.png 21 | ├── Despacito.mp3 22 | ├── Court_metrage.mp4 23 | ``` 24 | 25 | Résultat : 26 | ``` 27 | ├── Documents 28 | | ├── Facture.pdf 29 | ├── Images 30 | │ ├── Tour_eiffel.jpg 31 | │ ├── Logo.png 32 | ├── Musiques 33 | │ ├── Despacito.mp3 34 | ├── Videos 35 | │ ├── Court_metrage.mp4 36 | ``` -------------------------------------------------------------------------------- /Trigonometrie_Mesure_Principale/Trigonometrie_Mesure_Principale.py: -------------------------------------------------------------------------------- 1 | from fractions import Fraction 2 | 3 | def mesurePrincipale(numerateur, denominateur): 4 | # abs renvoie la valeur absolue 5 | if numerateur/denominateur < 0: 6 | while abs(numerateur / denominateur) > 1: 7 | numerateur=numerateur + 2 * denominateur 8 | else: 9 | while abs(numerateur / denominateur) > 1: 10 | numerateur=numerateur - 2 * denominateur 11 | return [numerateur, denominateur] 12 | 13 | print ("On entre la valeur de l'angle sous la forme N/D*pi") 14 | numerateur = input("Entrez un numérateur : ") 15 | denominateur = input("Entrez un dénominateur : ") 16 | 17 | try: 18 | numerateur = int(numerateur) 19 | denominateur = int(denominateur) 20 | resultat = mesurePrincipale(numerateur, denominateur) 21 | fractionReduite = Fraction(resultat[0], resultat[1]) 22 | print("La mesure principale est", fractionReduite, "π") 23 | except: 24 | print("Oups, il y a une erreur. \n") -------------------------------------------------------------------------------- /Nombre_mystere/Nombre_mystere.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | 3 | # Génération d'un nombre mystère aléatoirement entre 1 inclus et 50 inclus 4 | nombre_mystere = randint(1, 50) 5 | 6 | # Le joueur a 5 essais pour deviner le nombre 7 | for i in range(5): 8 | nombre = input("Quel est le nombre mystère ? ") 9 | 10 | # Valeur tapée par l'utilisateur n'est pas un nombre 11 | if not nombre.isdigit(): 12 | print("Veuillez entré un nombre valide...") 13 | continue 14 | 15 | nombre = int(nombre) 16 | 17 | # Vérifications si le nombre est plus petit/grand au nombre mystère 18 | if nombre > nombre_mystere: 19 | print("Le nombre mystère est plus petit que", nombre) 20 | elif nombre < nombre_mystere: 21 | print("Le nombre mystère est plus grand que", nombre) 22 | else: 23 | print("Bravo, vous avez trouvé le nombre mystère !") 24 | exit() 25 | 26 | print("Vous avez perdu. Le nombre mystère était", nombre_mystere) -------------------------------------------------------------------------------- /Cookie_Clicker/README.md: -------------------------------------------------------------------------------- 1 | # Cookie Clicker 2 | 3 | ## Notions abordées 4 | 5 | - Condition 6 | - Liste 7 | - Module ```tkinter``` (ou autres module pour créé des interfaces graphiques) 8 | - Module ```os``` et ```json``` pour enregistrer le compteur 9 | 10 | ## Énoncé 11 | 12 | Vous devez créer une interface graphique avec une image de cookie au centre de l'écran et à chaque fois que l'utilisateur clique sur le cookie incrémente le compteur de cookie. Une fois que la fenêtre a été fermé, enregistre le compteur dans un fichier .json comme ça à la prochaine exécution du programme le compteur sera initialisé à la valeur de la dernière utilisation. 13 | 14 | Résultat : 15 | 16 | ![Resultat](./resultat.gif) 17 | 18 | ## Solution 19 | 20 | Le code de la solution a été écrit sous Windows 10 avec Python v3.7.4. 21 | 22 | Afin de redimensionner l'image et de l'afficher correctement, j'ai utilisé le module Pillow donc veuillez l'installer avant d'exécuter ma solution. 23 | 24 | ```pip install Pillow``` 25 | -------------------------------------------------------------------------------- /Calculatrice/README.md: -------------------------------------------------------------------------------- 1 | # Calculatrice 2 | 3 | ## Notions abordées 4 | 5 | - Condition, Boucle et Liste 6 | - Fonction ```eval()``` 7 | - Module ```PySide2``` (ou autres module pour créé des interfaces graphiques) 8 | 9 | ## Énoncé 10 | 11 | Vous devez créer une interface graphique pour créer une calculatrice avec les 4 opérations de base : addition, soustraction, multiplication et division. 12 | 13 | Résultat : 14 | 15 | ![Resultat](./resultat.gif) 16 | 17 | ## Solution 18 | 19 | Le code de la solution a été écrit sous Windows 10 avec Python v3.7.4. 20 | 21 | J'utilise la librairie PySide2 donc si vous voulez tester ma solution, il faudra installer ce module. 22 | J'ai aussi utilisé QtDesigner installé avec PySide2 pour pouvoir faire l'interface graphique de manière très simple donc dans le dossier [custom_ui](./custom_ui) se trouve le fichier fenetrePrincipale.ui généré par QtDesigner et le fichier fenetrePrincipale.py qui est le fichier .ui "convertis" en Python grâce à **pyside2uic**. 23 | 24 | ```pip install PySide2``` -------------------------------------------------------------------------------- /Palindrome/README.md: -------------------------------------------------------------------------------- 1 | # Palindrome 2 | 3 | ## Notions abordées 4 | 5 | - Boucle, Condition 6 | - Fonction 7 | 8 | ## Énoncé 9 | 10 | Vous devez créer une fonction qui doit renvoyer ```True``` si la phrase entrée par l'utilisateur est un **palindrome** et ```False``` si ce n'est pas le cas. 11 | 12 | Un palindrome est une figure de style désignant un texte ou un mot dont l'ordre des lettres reste le même qu'on le lise de gauche à droite ou de droite à gauche. 13 | Exemple : 'kayak', 'radar' ... 14 | 15 | Vous devrez faire ceci sans utiliser la fonction toute faites de python ```reverse```. 16 | 17 | Exemple : 18 | ```py 19 | phrase = 'kayak' 20 | ``` 21 | 22 | Résultat : 23 | ```py 24 | >>> True 25 | ``` 26 | 27 | Pour aller plus loin : faire fonctionner la fonction estPalindrome() pour une phrase, par exemple : « LEON a rasé César à Noël ». Il faudra éliminer les espaces, transformer les lettres accentuées et/ou en majuscules en lettres minuscules non accentuées. 28 | 29 | Exemple : 30 | ```py 31 | phrase = 'LEON a rasé César à Noël' 32 | ``` 33 | 34 | Résultat : 35 | ```py 36 | >>> 'leonarasecesaranoel' 37 | >>> True 38 | ``` -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Divlo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Trier_des_fichiers/Trier_des_fichiers.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | chemin = os.path.dirname(__file__) 5 | listeFichiers = [f for f in os.listdir(chemin) if os.path.isfile(os.path.join(chemin, f))] # Liste contenant tous les fichiers (dossier exclu) 6 | 7 | dictionnaireDossier = { 8 | "Musiques": (".mp3", ".wav"), 9 | "Videos": (".mp4", ".mov"), 10 | "Images": (".png", ".jpg", ".jpeg", ".gif"), 11 | "Documents": (".pdf", ".json", ".txt") 12 | } 13 | 14 | def trieFichier(cheminFichier, fichier, cle): 15 | # Accède au tuple contenant toutes les extensions de fichiers 16 | if fichier.endswith(dictionnaireDossier[cle]): 17 | # Créer le dossier s'il n'existe pas 18 | dossier = os.path.join(chemin, cle) 19 | if not os.path.exists(dossier): 20 | os.makedirs(dossier) 21 | # Déplace le fichier dans le bon dossier 22 | cheminCible = os.path.join(chemin, cle + "/" + fichier) 23 | shutil.move(cheminFichier, cheminCible) 24 | 25 | # Trie les fichiers 26 | for fichier in listeFichiers: 27 | cheminFichier = os.path.join(chemin, fichier) 28 | for cle in dictionnaireDossier.keys(): 29 | trieFichier(cheminFichier, fichier, cle) -------------------------------------------------------------------------------- /Fenetres_Infinies/app.py: -------------------------------------------------------------------------------- 1 | from PySide2 import QtWidgets # pip install PySide2 2 | 3 | fenetres = [] # liste qui contient toutes les fenêtres ouvertes 4 | 5 | def mettreAJourNombreFenetre(): 6 | nombreDeFenetres = len(fenetres) 7 | for fenetre in fenetres: 8 | fenetre.resultatNombreFenetre.setText(f'Nombre de fenêtres : {nombreDeFenetres}') 9 | 10 | def creerFenetre(): 11 | fenetres.append(Fenetre()) 12 | mettreAJourNombreFenetre() 13 | 14 | class Fenetre(QtWidgets.QWidget): 15 | def __init__(self): 16 | super(Fenetre, self).__init__() 17 | self.setWindowTitle('Application') 18 | self.resize(280, 50) 19 | layout = QtWidgets.QVBoxLayout(self) 20 | button = QtWidgets.QPushButton('Cliquez sur le bouton') 21 | self.resultatNombreFenetre = QtWidgets.QLineEdit('Nombre de fenêtres : 0') 22 | 23 | layout.addWidget(button) 24 | layout.addWidget(self.resultatNombreFenetre) 25 | button.clicked.connect(creerFenetre) 26 | self.show() 27 | 28 | def closeEvent(self, event): 29 | del fenetres[fenetres.index(self)] 30 | mettreAJourNombreFenetre() 31 | event.accept() 32 | 33 | app = QtWidgets.QApplication([]) 34 | creerFenetre() 35 | app.exec_() -------------------------------------------------------------------------------- /La_liste_de_course/README.md: -------------------------------------------------------------------------------- 1 | # La liste de course 2 | 3 | ## Notions abordées 4 | 5 | - Conditions, Boucle et Liste 6 | - Modules ```os``` et ```json``` 7 | - Try et except (facultatif) 8 | 9 | ## Énoncé 10 | 11 | Vous devez demander à l'utilisateur de choisir une option comme ceci : 12 | ```py 13 | affichage = """ 14 | Choisissez une option: 15 | \t1: Ajouter un élément 16 | \t2: Enlever un élément 17 | \t3: Afficher la liste 18 | \t4: Vider la liste 19 | \t5: Sauvegarder la liste 20 | """ 21 | ``` 22 | 23 | Ensuite selon l'option choisie par l'utilisateur, ajoute/enlève un élément, afficher/vider la liste. 24 | 25 | Puis une fois que l'utilisateur a fini de rajouter ces éléments, il peut choisir l'option 5 pour sauvegarder la liste dans le dossier courant dans un fichier json, la prochaine fois que l'utilisateur relance le programme, il faudra que le programme s'occupe de charger le json afin de remettre la liste que l'utilisateur avait écrite. 26 | 27 | ## Solutions 28 | 29 | Le code de la solution a été écrit sous Windows 10 avec Python v3.7.4. 30 | 31 | Afin de rendre le terminal plus clair à certains endroits je clear la console pour avoir un meilleur affichage, sachez que cette commande est différente si vous êtes sur Mac/Linux donc si vous obtenez une erreur en lançant mon programme veuillez enlever les lignes : 32 | ```py 33 | os.system('cls') 34 | ``` -------------------------------------------------------------------------------- /Cookie_Clicker/Cookie_Clicker.py: -------------------------------------------------------------------------------- 1 | import tkinter 2 | from PIL import Image, ImageTk # pip install Pillow 3 | import os 4 | import json 5 | 6 | dossier_courant = os.path.dirname(__file__) 7 | chemin_nombreClique = os.path.join(dossier_courant, "nombreClique.json") 8 | chemin_imageCookie = os.path.join(dossier_courant, "cookie.png") 9 | chemin_iconCookie = os.path.join(dossier_courant, "cookie.ico") 10 | 11 | try: 12 | with open(chemin_nombreClique, "r") as f: 13 | nombreCompteur = json.load(f)[0] 14 | except: 15 | nombreCompteur = 0 16 | 17 | def compteur(): 18 | global nombreCompteur 19 | nombreCompteur += 1 20 | labelCompteur.config(text = nombreCompteur) 21 | 22 | # Paramètres fenêtre 23 | window = tkinter.Tk() 24 | window.title("Cookie Clicker") 25 | window.geometry("640x540") 26 | window.minsize(480, 360) 27 | window.iconbitmap(chemin_iconCookie) 28 | 29 | # Titre 30 | labelTitle = tkinter.Label(window, text="Cookie Clicker", font=("Arial", 25)) 31 | labelTitle.pack() 32 | 33 | # Compteur 34 | labelCompteur = tkinter.Label(window, text=nombreCompteur, font=("Arial", 18)) 35 | labelCompteur.pack() 36 | 37 | # Image 38 | img = Image.open(chemin_imageCookie) 39 | img = img.resize((200, 200)) 40 | img = ImageTk.PhotoImage(img) 41 | panel = tkinter.Button(window, image = img, bd=0, command=compteur) 42 | panel.pack(expand="yes") 43 | 44 | # Affiche la fenètre 45 | window.mainloop() 46 | 47 | # Enregistre le compteur dans le json 48 | with open(chemin_nombreClique, "w") as f: 49 | json.dump([nombreCompteur], f) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /Palindrome/Palindrome.py: -------------------------------------------------------------------------------- 1 | # Retourne un booléen, True si la phrase est un palindrome, False si ce n'est pas le cas 2 | def estPalindrome(phrase): 3 | phraseTaille = len(phrase) - 1 # Taille de la phrase -1 car commence à 0 4 | nouvellePhrase = "" # Phrase qui va être inversée 5 | indexNormal = 0 # IndexNormal commence à compter à partir de 0 6 | # IndexInverser commence à compter à partir de la phraseTaille, puis descend de -1 à chaque tour de boucle 7 | for indexInverser in range(phraseTaille, -1, -1): 8 | # Si le caractère à l'indexInverser est le même que dans l'indexNormal alors tu l'ajoutes à nouvellePhrase 9 | if phrase[indexInverser] == phrase[indexNormal]: 10 | nouvellePhrase = nouvellePhrase + phrase[indexNormal] 11 | # Incrémente de 1 à chaque tour de boucle l'indexNormal 12 | indexNormal+=1 13 | return phrase == nouvellePhrase 14 | 15 | # Retourne la phrase sans espaces 16 | def enleveEspace(phrase): 17 | return phrase.replace(" ", "") 18 | 19 | # Retourne la phrase sans accents 20 | def enleveAccent(phrase): 21 | # Initialistion des listes contenant les accents 22 | avecAccent = ['é', 'è', 'ê', 'ë', 'à', 'ù', 'û', 'ç', 'ô', 'î', 'ï', 'â'] 23 | sansAccent = ['e', 'e', 'e', 'e', 'a', 'u', 'u', 'c', 'o', 'i', 'i', 'a'] 24 | 25 | # Boucle qui parcourt chaque accent dans la liste 'avecAccent' 26 | for i in range(len(avecAccent)): 27 | # Remplace toutes les occurences d'un accent par ça lettre sans accent 28 | phrase = phrase.replace(avecAccent[i], sansAccent[i]) 29 | return phrase 30 | 31 | # Demande à l'utilisateur une phrase à vérifier 32 | phrase = input("Entrez une phrase : ") # exemple de phrase : LEON a rasé César à Noël 33 | 34 | # Éxecution dans l'ordre : .lower pour mettre en minuscule puis enleveEspace puis enleveAccent et pour finir estPalindrome 35 | if estPalindrome(enleveAccent(enleveEspace(phrase.lower()))): 36 | print("La phrase est un palindrome.") 37 | else: 38 | print("La phrase n'est pas un palindrome.") 39 | 40 | print(enleveAccent(enleveEspace(phrase.lower()))) -------------------------------------------------------------------------------- /La_liste_de_course/La_liste_de_course.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | os.system('cls') 5 | 6 | dossier_courant = os.path.dirname(__file__) 7 | chemin_liste = os.path.join(dossier_courant, "liste.json") 8 | 9 | try: 10 | with open(chemin_liste, "r") as f: 11 | liste_de_courses = json.load(f) 12 | except: 13 | liste_de_courses = [] 14 | 15 | affichage = """ 16 | Choisissez une option: 17 | \t1: Ajouter un élément 18 | \t2: Enlever un élément 19 | \t3: Afficher la liste 20 | \t4: Vider la liste 21 | \t5: Sauvegarder la liste 22 | """ 23 | 24 | option = "0" 25 | 26 | while option != "5": 27 | option = input(affichage) 28 | if option == "1": 29 | item_a_ajouter = input("Entrez le nom de l'élément à ajouter: ") 30 | os.system('cls') 31 | if item_a_ajouter == '': 32 | print("Vous ne pouvez pas rajouté un élement vide.") 33 | else: 34 | print(f"L'élément '{item_a_ajouter}' a été ajouté à la liste.") 35 | liste_de_courses.append(item_a_ajouter) 36 | elif option == "2": 37 | item_a_retirer = input("Entrez le nom de l'élément à enlever: ") 38 | if item_a_retirer in liste_de_courses: 39 | os.system('cls') 40 | print(f"L'élément '{item_a_retirer}' a été retiré de la liste.") 41 | liste_de_courses.remove(item_a_retirer) 42 | else: 43 | os.system('cls') 44 | print("L'élément que vous voulez enlever n'est pas dans la liste...") 45 | elif option == "3": 46 | if liste_de_courses: 47 | os.system('cls') 48 | print("La liste des éléments de votre liste :") 49 | print("\n".join(liste_de_courses)) 50 | else: 51 | os.system('cls') 52 | print("La liste ne contient aucun élément.") 53 | elif option == "4": 54 | liste_de_courses.clear() 55 | os.system('cls') 56 | print("La liste de course est vide.") 57 | 58 | with open(chemin_liste, "w") as f: 59 | json.dump(liste_de_courses, f) 60 | os.system('cls') 61 | print("Votre liste a été sauvegardé sur votre disque (fichier json).") -------------------------------------------------------------------------------- /Encodage_caractere/Encodage_Caractere.py: -------------------------------------------------------------------------------- 1 | # Formate les nombres avec des espaces (ex : 76120 = 76 120) 2 | def formatNumberResult(x): 3 | x = int(x) 4 | return '{:,}'.format(x).replace(',', ' ') 5 | 6 | affichage = """ 7 | Choisissez une option: 8 | \t1: Décimal en Binaire 9 | \t2: Binaire en Décimal 10 | \t3: Décimal en Hexadecimal 11 | \t4: Hexadecimal en Décimal 12 | \t5: Binaire en Hexadécimal 13 | \t6: Hexadécimal en Binaire 14 | \t7: Quitter le programme 15 | """ 16 | 17 | option = "0" 18 | resultat = "" 19 | while option != "7": 20 | option = input(affichage) 21 | try: 22 | # Décimal en Binaire 23 | if option == "1": 24 | valeur = input("Votre valeur : ") 25 | valeur = valeur.replace(" ", "") 26 | resultat = bin(int(valeur)).replace("0b", "") 27 | print(f"Décimal : {formatNumberResult(valeur)} \nBinaire : {resultat} \n") 28 | 29 | # Binaire en Décimal 30 | elif option == "2": 31 | valeur = input("Votre valeur : ") 32 | resultat = int(valeur, 2) 33 | print(f"Binaire : {valeur} \nDécimal : {formatNumberResult(resultat)} \n") 34 | 35 | # Décimal en Hexadécimal 36 | elif option == "3": 37 | valeur = input("Votre valeur : ") 38 | valeur = valeur.replace(" ", "") 39 | resultat = hex(int(valeur)).replace("0x", "").upper() 40 | print(f"Décimal : {formatNumberResult(valeur)} \nHexadécimal : {resultat} \n") 41 | 42 | # Hexadécimal en Décimal 43 | elif option == "4": 44 | valeur = input("Votre valeur : ") 45 | resultat = int(valeur, 16) 46 | print(f"Hexadécimal : {valeur} \nDécimal : {formatNumberResult(resultat)}") 47 | 48 | # Binaire en Hexadécimal 49 | elif option == "5": 50 | valeur = input("Votre valeur : ") 51 | resultat = hex(int(valeur, 2)).replace("0x", "").upper() 52 | print(f"Binaire : {valeur} \nHexadécimal : {resultat}") 53 | 54 | # Hexadécimal en Binaire 55 | elif option == "6": 56 | valeur = input("Votre valeur : ") 57 | resultat = bin(int(valeur, 16)).replace("0b", "") 58 | print(f"Hexadécimal : {valeur} \nBinaire : {resultat}") 59 | except: 60 | print("Vous n'avez pas rentré de valeur valide.\n") 61 | 62 | print("Vous avez quitté le programme.") -------------------------------------------------------------------------------- /Mastermind/README.md: -------------------------------------------------------------------------------- 1 | # Mastermind 2 | 3 | ## Notions abordées 4 | - Condition et Boucle 5 | - Liste 6 | - Module ```random``` 7 | - Fonctions split ou/et compréhension de liste 8 | 9 | ## Histoire et Règles 10 | 11 | Le Mastermind est un jeu de société pour deux joueurs dont le but est de trouver un code. Jeu de réflexion, et de déduction, inventé dans les années 1970. 12 | Le but est de deviner, par déductions successives, la couleur et la position des 5 pions cachés que l'adversaire a choisie (en l'occurrence dans notre cas ça sera python qui choisira aléatoirement). 13 | Donc le joueur a 12 essais pour deviner la couleur et la position de la combinaison, à chaque fois que le joueur essaye, l'adversaire (en l'occurrence python encore une fois) devra nous indiquer si il y a des pions qui ont la bonne couleur et bien placés ou si il y a des bonnes couleurs mais qui sont mal placés, voilà donc à chaque tour le joueur réessaye une combinaison en prenant compte le résultat de l'adversaire pour essayer de deviner la combinaison en moins d'essais possible. 14 | 15 | ## Énoncé 16 | Les couleurs disponibles seront : 17 | ```py 18 | couleurDisponible = ["Vert", "Blanc", "Rouge", "Jaune", "Bleu", "Noir", "Rose", "Violet", "Orange", "Gris"] 19 | ``` 20 | L'ordinateur devra créer une liste qui contiendra 5 couleurs prises au hasard dans les couleurs disponibles (il peut avoir plusieurs fois la même couleur dans une combinaison) 21 | Le joueur tapera les couleurs dans un input qui formera une liste : 22 | ```py 23 | couleurEntree = input("Entrez les couleurs : ").split(", ") 24 | ``` 25 | Si la combinaison à deviner est : 26 | ```py 27 | ['Rose', 'Gris', 'Rouge', 'Bleu', 'Jaune'] 28 | ``` 29 | Et que le joueur tape : 30 | ``` 31 | Rose, Rouge, Gris, Vert, Blanc 32 | ``` 33 | Alors python devra afficher : 34 | ``` 35 | Couleurs juste et bonne place : [['Rose', 1]] 36 | Couleurs mauvaise place : [['Rouge', 2], ['Gris', 3]] 37 | Il vous reste 11 essais... 38 | ``` 39 | 40 | ## Solutions 41 | 42 | Le code de la solution a été écrit sous Windows 10 avec Python v3.7.4. 43 | 44 | Au moment où vous lancez mon programme, vous devrez entrer le nombre d'essais maximum, le nombre de couleurs à deviner et le mode de jeu (Facile ou Difficile). 45 | 46 | Si vous n'entrez rien, les valeurs par défaut s'appliqueront : 47 | ``` 48 | - 12 : nombre d'essais maximum 49 | - 5 : nombre de couleurs à deviner 50 | - Facile : mode de jeu 51 | ``` 52 | 53 | Le mode de jeu Facile affiche la position des couleurs justes/mauvaise place alors que le mode difficile dit rien sur la position ou sur la couleur, il dit juste le nombre de couleurs juste/mauvaise place. -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 🚀 Contribuer au projet 2 | 3 | ## Types de contributions 4 | 5 | * Proposer un challenge/exercice 6 | * Partager une nouvelle solution pour un exercice déjà présent 7 | * Corriger une faute d'orthographe 8 | 9 | **Proposer. Partager. Corriger.** 10 | 11 | ## Comment proposer vos changements ? 12 | 13 | ### Étape 1 : Fork ce dépôt 14 | 15 | Le plus souvent, les forks sont utilisées pour proposer des modifications au projet de quelqu'un d'autre. 16 | 17 | - Aller sur le dépôt GitHub de [Divlo/PythonChallanges](https://github.com/Divlo/PythonChallenges). 18 | 19 | - Dans le coin supérieur droit de la page, cliquez sur **Fork**. 20 | ![Fork Button](https://help.github.com/assets/images/help/repository/fork_button.jpg) 21 | 22 | [Plus d'informations sur la documentation de GitHub pour faire un fork.](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) 23 | 24 | ### Étape 2 : Vos changements 25 | 26 | #### Créer l'énoncé d'un exercice : 27 | 28 | Afin de facilement se repérer, veuillez mettre votre nouveau challenge dans un nouveau **dossier à la racine du projet** avec un nom explicite ainsi qu'à respecter le format : ```Nom_du_challenge```, c'est-à-dire commencer par une majuscule et éviter les espaces/accents... 29 | 30 | À la racine de ce nouveau dossier, vous veillerez à mettre un fichier ```README.md``` expliquant l'énoncé de l'exercice. 31 | 32 | **Format de l'énoncé :** 33 | ``` 34 | # Titre du Challenge 35 | 36 | # Notions abordées (ainsi que les potentiels modules à utiliser) 37 | - Boucles 38 | - Conditions 39 | ... 40 | 41 | # Énoncé 42 | ... Explication simple et clair ... 43 | ``` 44 | 45 | (Vous pouvez, si vous le souhaitez mettre un nouvel énoncé sans la solution de celui-ci) 46 | 47 | #### La solution du nouvel exercice 48 | 49 | Dans la solution de l'exercice, veuillez à : 50 | * Mettre des commentaires pour expliquer votre code 51 | * Nom des variables/fonctions cohérentes et en suivant une convention de nommage comme le snake_case ou le camelCase. 52 | 53 | **Facultatif :** Crée un fichier expliquant votre solution, version de python, comment utiliser la solution... 54 | 55 | ### Étape 3 : Pull Request 56 | 57 | Si vous avez fork un repo et vous y avez apporté des modifications, vous pouvez demander au repo d'accepter vos modifications en créant un **Pull Request**. 58 | 59 | ![Pull Request](https://help.github.com/assets/images/help/pull_requests/pull-request-start-review-button.png) 60 | 61 | [Plus d'informations sur la documentation de GitHub pour faire un pull request.](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork) 62 | 63 | Merci de votre soutien ! -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

PythonChallenges

2 | 3 |

4 | Exercices et challenges en français pour s'améliorer en Python. 5 |

6 | 7 |

8 | Licence MIT 9 | Repo Size 10 | Commit Activity 11 | Contributeurs 12 | Stars 13 |

14 | Python 15 |

16 | 17 | ## 🐍 À propos 18 | **PythonChallenges** regroupe plein d'exercices et challenges en français pour s'améliorer en Python. 19 | 20 | Chaque **challenge** dispose de sa **solution** et de son **énoncé** afin que vous puissiez essayer de les résoudre tout seul, parfait pour s'entraîner et pratiquer votre algorithmie en **Python**. 21 | 22 | ## 📖 Sommaire des challenges 23 | 24 | - [Calcul de moyenne](./Calcul_de_moyenne) 25 | - [Calculatrice (interface graphique)](./Calculatrice) 26 | - [Cookie Clicker (interface graphique)](./Cookie_Clicker) 27 | - [Encodage des caractères et conversion en Binaire, en Hexadécimal, etc.](./Encodage_caractere) 28 | - [Fenêtres Infinies (interface graphique)](./Fenetres_Infinies) 29 | - [La suite de Fibonacci](./Fibonacci) 30 | - [La liste de course](./La_liste_de_course) 31 | - [Mastermind](./Mastermind) 32 | - [Nombre Mystère](./Nombre_mystere) 33 | - [Nombre Premier](./Nombre_premier) 34 | - [Palindrome](./Palindrome) 35 | - [Pyramide](./Pyramide) 36 | - [Trier des fichiers selon leur type](./Trier_des_fichiers) 37 | - [Trigonométrie - Mesure Principale](./Trigonometrie_Mesure_Principale) 38 | 39 | ## 🧠 Bloquer sur un exercice ? 40 | 41 | Surtout n'abandonnez pas, et ne regardez pas la solution, faites la vôtre ! 42 | 43 | Afin de vous aider à résoudre ses différents exercices, j'ai mis en place un fichier [HELP.md](./HELP.md) avec la méthodologie que j'utilise quand je suis face à un problème donné. C'est une méthodologie parmi tant d'autres et malheureusement ça ne fait pas des miracles alors au boulot ! 😉 44 | 45 | ## 🚀 Comment contribuer ? 46 | 47 | Vous aimez **PythonChallenges** et vous voulez proposer vos challenges, proposer une solution ou même corriger une simple faute d'orthographe ? 48 | Tout le monde peut contribuer à l'amélioration du projet ! 49 | Les étapes à suivre pour contribuer se trouvent dans le fichier [CONTRIBUTING.md](./CONTRIBUTING.md). 50 | 51 | ## 📄 Licence 52 | 53 | Ce projet est sous licence MIT - voir le fichier [LICENSE](./LICENSE) pour plus de détails. 54 | -------------------------------------------------------------------------------- /HELP.md: -------------------------------------------------------------------------------- 1 | # Méthodologie pour résoudre un problème 2 | 3 | Afin de vous aider à résoudre ses différents exercices, je vais vous partager ma méthodologie que j'utilise quand je suis face à un problème donné. 4 | C'est une méthodologie parmi tant d'autres et malheureusement ça ne fait pas des miracles alors motivez-vous et au boulot ! 😉 5 | 6 | ## Décrire la solution 7 | 8 | Concrètement, vous allez rédiger les **étapes en français**, c'est-à-dire vous écrivez selon vous ce qu'il faudrait faire (ça peut être en vrac au début, juste toutes les idées qui vous passent par la tête), n'hésitez pas à prendre un brouillon et à faire un schéma si cela vous aide. 9 | 10 | Posez-vous toujours la question de comment **nous** humain réglons ce problème, mettez ça sur un **brouillon étape par étape**. 11 | 12 | ## Diviser le problème en plusieurs sous-problèmes 13 | 14 | Une fois que vous avez des idées comme ça en français, vous pouvez vous concentrer chaque étape un à un. 15 | Si vraiment vous n'avez absolument aucune idée, aucune piste, de comment résoudre l'exercice, c'est probablement qu'il est trop difficile pour votre niveau. 16 | Si l'exercice est de votre niveau, normalement, vous devrez avoir au moins des pistes. 17 | Après aussi, il faut bien connaître le langage. **Connaître les méthodes des chaînes de caractères, des listes, des nombres entiers etc**, ça aide à trouver des solutions. 18 | Vous n'êtes pas obligé de tout connaître. Vous pouvez faire une recherche sur **google (sur Stack Overflow)** devrait vous permettre de trouver la méthode ou fonction pour faire cette étape. 19 | 20 | ## Exemple concret : 21 | 22 | Énoncé : *Vous devez créer une liste qui contiendra des sous-listes, pour chaque phrase une sous-liste contenant les mots dont la taille ainsi que sa position dans la phrase est paire.* 23 | 24 | * Étapes en français : 25 | ``` 26 | - Trouver les phrases dans ton texte. 27 | - Trouver les mots dans ta phrase. 28 | - Compter la taille d'un mot. 29 | - Vérifier si la taille du mot et que sa position est paire 30 | - Rajouter les éléments qui vérifient cette condition dans une nouvelle liste 31 | ``` 32 | 33 | * Sous-problèmes : 34 | ``` 35 | - Trouver les phrases dans ton texte : qu'est-ce qui définit une phrase ? Généralement un point. Comment trouver les points dans une chaîne de caractères ? Tu peux utiliser split en python par exemple. 36 | - Compter la taille d'un mot : Une fonction qui nous donne la taille du mot ? 37 | - Position paire : Boucle qui énumère sur la liste avec un i qui vaut 1 au début puis à chaque itération de boucle fait + 1, pourquoi 1 car une liste commence par 0... 38 | etc. 39 | ... 40 | ``` 41 | 42 | Comme je l'ai dit, il est **inutile de tout savoir** et c'est même quasiment **impossible**, vaut mieux connaître en survol les fonctions mais si vous avez besoin de la syntaxe exacte, vous **rechercherez sur internet**, par exemple pour trouver la taille d'un mot : 43 | De préférence en anglais : ```length string Python```, 1er résultat, vous trouverez la fonction ```len()```, par ailleurs noté que je n'ai pas fait de phrase, mettez des mots-clés ça sera plus efficace. 44 | 45 | Ainsi de suite... 46 | 47 | Bon courage ! 🙂 -------------------------------------------------------------------------------- /Calculatrice/Calculatrice.py: -------------------------------------------------------------------------------- 1 | from PySide2 import QtWidgets, QtGui, QtCore 2 | from functools import partial 3 | from custom_ui.fenetrePrincipale import Ui_form_calculatrice 4 | 5 | # Formate les nombres avec des espaces (ex : 76120 = 76 120) 6 | def formatNumberResult(x): 7 | if isinstance(x, int): 8 | x = int(x) 9 | else: 10 | x = float(x) 11 | return '{:,}'.format(x).replace(',', ' ') 12 | 13 | class Calculatrice(Ui_form_calculatrice, QtWidgets.QWidget): 14 | def __init__(self): 15 | super(Calculatrice, self).__init__() 16 | self.setupUi(self) 17 | self.modificationSetupUi() 18 | self.setupConnections() 19 | self.setupRaccourcisClavier() 20 | self.show() 21 | 22 | def modificationSetupUi(self): 23 | self.btns_nombres = [] # liste qui contient tout les chiffres de 0 à 9 24 | for i in range(self.gridLayout.count()): 25 | widget = self.gridLayout.itemAt(i).widget() 26 | if isinstance(widget, QtWidgets.QPushButton): 27 | widget.setStyleSheet('QPushButton:hover {color: #5b5c5c;}') 28 | if widget.text().isdigit(): 29 | self.btns_nombres.append(widget) 30 | 31 | def setupConnections(self): 32 | for btn in self.btns_nombres: 33 | btn.clicked.connect(partial(self.btnNombrePressed, btn.text())) 34 | 35 | self.btn_moins.clicked.connect(partial(self.btnOperationPressed, '-')) 36 | self.btn_plus.clicked.connect(partial(self.btnOperationPressed, '+')) 37 | self.btn_mult.clicked.connect(partial(self.btnOperationPressed, '*')) 38 | self.btn_div.clicked.connect(partial(self.btnOperationPressed, '/')) 39 | self.btn_point.clicked.connect(partial(self.btnOperationPressed, '.')) 40 | 41 | self.btn_egal.clicked.connect(self.calculOperation) 42 | self.btn_c.clicked.connect(self.supprimerResultat) 43 | 44 | def setupRaccourcisClavier(self): 45 | for btn in range(10): 46 | QtWidgets.QShortcut(QtGui.QKeySequence(btn), self, partial(self.btnNombrePressed, btn)) 47 | 48 | QtWidgets.QShortcut(QtGui.QKeySequence('+'), self, partial(self.btnOperationPressed, '+')) 49 | QtWidgets.QShortcut(QtGui.QKeySequence('-'), self, partial(self.btnOperationPressed, '-')) 50 | QtWidgets.QShortcut(QtGui.QKeySequence('*'), self, partial(self.btnOperationPressed, '*')) 51 | QtWidgets.QShortcut(QtGui.QKeySequence('/'), self, partial(self.btnOperationPressed, '/')) 52 | QtWidgets.QShortcut(QtGui.QKeySequence('.'), self, partial(self.btnOperationPressed, '.')) 53 | 54 | QtWidgets.QShortcut(QtGui.QKeySequence('Esc'), self, self.close) 55 | QtWidgets.QShortcut(QtGui.QKeySequence('Return'), self, self.calculOperation) 56 | QtWidgets.QShortcut(QtGui.QKeySequence('Entrer'), self, self.calculOperation) 57 | QtWidgets.QShortcut(QtGui.QKeySequence('Del'), self, self.supprimerResultat) 58 | 59 | def btnNombrePressed(self, bouton): 60 | """Fonction activée quand l'utilisateur appuie sur un chiffre (0-9)""" 61 | resultat = self.le_resultat.text() 62 | if resultat == '0': 63 | self.le_resultat.setText(bouton) 64 | else: 65 | self.le_resultat.setText(resultat + bouton) 66 | 67 | def btnOperationPressed(self, operation): 68 | """Fonction activée quand l'utilisateur appuie sur une touche d'opération (+, -, /, *)""" 69 | resultat = self.le_resultat.text() 70 | self.le_resultat.setText(resultat + " " + operation + " ") 71 | 72 | def supprimerResultat(self): 73 | """On reset le texte des deux LineEdit""" 74 | self.le_resultat.setText('0') 75 | self.le_operation.setText('') 76 | 77 | def calculOperation(self): 78 | resultat = self.le_resultat.text() 79 | 80 | # On ajoute le nombre actuel dans le LineEdit resultat au LineEdit operation 81 | self.le_operation.setText(resultat) 82 | 83 | # On evalue (et calcule) le resultat de l'opération 84 | resultatOperation = eval(self.le_operation.text().replace(" ", "")) 85 | 86 | # On met le resultat final dans le LineEdit resultat 87 | self.le_resultat.setText(formatNumberResult(resultatOperation)) 88 | 89 | app = QtWidgets.QApplication([]) 90 | fenetre = Calculatrice() 91 | app.exec_() -------------------------------------------------------------------------------- /Mastermind/Mastermind.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | 3 | # Fonction Valeur vide 4 | def estValeurVide(valeur): 5 | return valeur == '' or valeur is None 6 | 7 | # Choix des valeurs et Modes de Jeux 8 | def choixModeDeJeu(modeDeJeu): 9 | if modeDeJeu == "Difficile": 10 | return modeDeJeuDifficile 11 | else: 12 | return modeDeJeuFacile 13 | def modeDeJeuFacile(couleurJuste, couleurMauvaisePlace): 14 | print("Couleurs justes et bonne place :", couleurJuste) 15 | print("Couleurs justes mais mal placées :", couleurMauvaisePlace) 16 | def modeDeJeuDifficile(couleurJuste, couleurMauvaisePlace): 17 | print("Vous avez", len(couleurJuste), "couleurs justes et à la bonne place!") 18 | print("Vous avez", len(couleurMauvaisePlace), "couleurs justes mais à la mauvaise place!") 19 | def choixNombreCouleurADeviner(nombreCouleurADeviner): 20 | if estValeurVide(nombreCouleurADeviner): 21 | return 5 22 | else: 23 | return int(nombreCouleurADeviner) 24 | def choixNombreEssaiMaximum(nombreEssaiMaximum): 25 | if estValeurVide(nombreEssaiMaximum): 26 | return 12 27 | else: 28 | return int(nombreEssaiMaximum) 29 | 30 | # La fonction Mastermind 31 | def mastermind(nombreEssaiMaximum = 12, nombreCouleurADeviner = 5, modeDeJeu = modeDeJeuFacile): 32 | 33 | # Initialisation des variables 34 | couleurDisponible = ["Vert", "Blanc", "Rouge", "Jaune", "Bleu", "Noir", "Rose", "Violet", "Orange", "Gris"] 35 | couleurEntree = [] 36 | couleurADeviner = [couleurDisponible[randint(0, len(couleurDisponible) - 1)] for i in range(nombreCouleurADeviner)] 37 | 38 | # print("La combinaison à deviner est ", couleurADeviner, "\n") # pour tester uniquement 39 | 40 | # Combinaisons pour essayer de battre l'ordinateur 41 | for nombreTentative in range(nombreEssaiMaximum): 42 | 43 | # Demande les couleurs (ex: Rouge, Bleu, Vert, Jaune, Noir) 44 | couleurEntree = input("Entrez les couleurs : ").split(", ") 45 | couleurEntreeLength = len(couleurEntree) 46 | 47 | # Si la proposition ne dépasse pas nombreCouleurADeviner, on peut continuer : 48 | if couleurEntreeLength <= nombreCouleurADeviner: 49 | 50 | # Si mauvaise combinaison : 51 | if couleurEntree != couleurADeviner: 52 | 53 | # Remise à zéro des variables couleurJuste et couleurMauvaisePlace pour le prochain tour de boucle 54 | couleurMauvaisePlace = [] 55 | couleurJuste = [] 56 | 57 | # Boucle de vérification 58 | for i in range(0, couleurEntreeLength): 59 | if couleurEntree[i] == couleurADeviner[i]: 60 | couleurJuste.append([couleurEntree[i], i + 1]) 61 | elif couleurEntree[i] in couleurADeviner: 62 | couleurMauvaisePlace.append([couleurEntree[i], i + 1]) 63 | 64 | # Si couleurMauvaisePlace et que couleurJuste est vide alors il n'y a aucune couleur de juste 65 | if not couleurMauvaisePlace and not couleurJuste: 66 | print("Vous n'avez aucune couleur de juste.") 67 | # Affichage des couleurs mauvaises/justes 68 | else: 69 | modeDeJeu(couleurJuste, couleurMauvaisePlace) 70 | 71 | # Affichage du nombre d'essai restant 72 | essaiRestant = nombreEssaiMaximum - (nombreTentative + 1) 73 | if essaiRestant > 0: 74 | print("Il vous reste", essaiRestant ,"essais...\n") 75 | continue 76 | else: 77 | print("\nVous avez perdu, la combinaison était :", couleurADeviner) 78 | break 79 | 80 | # Si bonne combinaison : 81 | else: 82 | print("Bravo, vous avez gagné en", (nombreTentative + 1) ," essais! \nles couleurs étaient bien :", couleurEntree) 83 | break 84 | else: 85 | print("Vous ne pouvez pas rentré plus de", nombreCouleurADeviner, "couleurs...\n") 86 | 87 | # Exécution de la fonction Mastermind 88 | nombreEssaiMaximum = input("Nombre d'essai maximum : ") 89 | nombreCouleurADeviner = input("Nombre de couleurs à deviner : ") 90 | modeDeJeu = input("Mode de jeu Facile/Difficile ? ") 91 | print("") 92 | 93 | try: 94 | mastermind(choixNombreEssaiMaximum(nombreEssaiMaximum), choixNombreCouleurADeviner(nombreCouleurADeviner), choixModeDeJeu(modeDeJeu)) 95 | except: 96 | print("Oups, il y a une erreur. \n") -------------------------------------------------------------------------------- /Calculatrice/custom_ui/fenetrePrincipale.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from PySide2 import QtCore, QtGui, QtWidgets 4 | 5 | class Ui_form_calculatrice(object): 6 | def setupUi(self, form_calculatrice): 7 | form_calculatrice.setObjectName("form_calculatrice") 8 | form_calculatrice.resize(256, 360) 9 | self.gridLayout = QtWidgets.QGridLayout(form_calculatrice) 10 | self.gridLayout.setSpacing(0) 11 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 12 | self.gridLayout.setObjectName("gridLayout") 13 | self.btn_c = QtWidgets.QPushButton(form_calculatrice) 14 | self.btn_c.setMinimumSize(QtCore.QSize(64, 64)) 15 | self.btn_c.setMaximumSize(QtCore.QSize(64, 64)) 16 | font = QtGui.QFont() 17 | font.setPointSize(12) 18 | font.setWeight(75) 19 | font.setBold(True) 20 | self.btn_c.setFont(font) 21 | self.btn_c.setFlat(True) 22 | self.btn_c.setObjectName("btn_c") 23 | self.gridLayout.addWidget(self.btn_c, 2, 0, 1, 1) 24 | self.btn_7 = QtWidgets.QPushButton(form_calculatrice) 25 | self.btn_7.setMinimumSize(QtCore.QSize(64, 64)) 26 | self.btn_7.setMaximumSize(QtCore.QSize(64, 64)) 27 | font = QtGui.QFont() 28 | font.setPointSize(12) 29 | font.setWeight(75) 30 | font.setBold(True) 31 | self.btn_7.setFont(font) 32 | self.btn_7.setFlat(True) 33 | self.btn_7.setObjectName("btn_7") 34 | self.gridLayout.addWidget(self.btn_7, 3, 0, 1, 1) 35 | self.btn_8 = QtWidgets.QPushButton(form_calculatrice) 36 | self.btn_8.setMinimumSize(QtCore.QSize(64, 64)) 37 | self.btn_8.setMaximumSize(QtCore.QSize(64, 64)) 38 | font = QtGui.QFont() 39 | font.setPointSize(12) 40 | font.setWeight(75) 41 | font.setBold(True) 42 | self.btn_8.setFont(font) 43 | self.btn_8.setFlat(True) 44 | self.btn_8.setObjectName("btn_8") 45 | self.gridLayout.addWidget(self.btn_8, 3, 1, 1, 1) 46 | self.btn_9 = QtWidgets.QPushButton(form_calculatrice) 47 | self.btn_9.setMinimumSize(QtCore.QSize(64, 64)) 48 | self.btn_9.setMaximumSize(QtCore.QSize(64, 64)) 49 | font = QtGui.QFont() 50 | font.setPointSize(12) 51 | font.setWeight(75) 52 | font.setBold(True) 53 | self.btn_9.setFont(font) 54 | self.btn_9.setFlat(True) 55 | self.btn_9.setObjectName("btn_9") 56 | self.gridLayout.addWidget(self.btn_9, 3, 2, 1, 1) 57 | self.btn_mult = QtWidgets.QPushButton(form_calculatrice) 58 | self.btn_mult.setMinimumSize(QtCore.QSize(64, 64)) 59 | self.btn_mult.setMaximumSize(QtCore.QSize(64, 64)) 60 | font = QtGui.QFont() 61 | font.setPointSize(12) 62 | font.setWeight(75) 63 | font.setBold(True) 64 | self.btn_mult.setFont(font) 65 | self.btn_mult.setFlat(True) 66 | self.btn_mult.setObjectName("btn_mult") 67 | self.gridLayout.addWidget(self.btn_mult, 3, 3, 1, 1) 68 | self.btn_4 = QtWidgets.QPushButton(form_calculatrice) 69 | self.btn_4.setMinimumSize(QtCore.QSize(64, 64)) 70 | self.btn_4.setMaximumSize(QtCore.QSize(64, 64)) 71 | font = QtGui.QFont() 72 | font.setPointSize(12) 73 | font.setWeight(75) 74 | font.setBold(True) 75 | self.btn_4.setFont(font) 76 | self.btn_4.setFlat(True) 77 | self.btn_4.setObjectName("btn_4") 78 | self.gridLayout.addWidget(self.btn_4, 4, 0, 1, 1) 79 | self.btn_5 = QtWidgets.QPushButton(form_calculatrice) 80 | self.btn_5.setMinimumSize(QtCore.QSize(64, 64)) 81 | self.btn_5.setMaximumSize(QtCore.QSize(64, 64)) 82 | font = QtGui.QFont() 83 | font.setPointSize(12) 84 | font.setWeight(75) 85 | font.setBold(True) 86 | self.btn_5.setFont(font) 87 | self.btn_5.setFlat(True) 88 | self.btn_5.setObjectName("btn_5") 89 | self.gridLayout.addWidget(self.btn_5, 4, 1, 1, 1) 90 | self.btn_6 = QtWidgets.QPushButton(form_calculatrice) 91 | self.btn_6.setMinimumSize(QtCore.QSize(64, 64)) 92 | self.btn_6.setMaximumSize(QtCore.QSize(64, 64)) 93 | font = QtGui.QFont() 94 | font.setPointSize(12) 95 | font.setWeight(75) 96 | font.setBold(True) 97 | self.btn_6.setFont(font) 98 | self.btn_6.setFlat(True) 99 | self.btn_6.setObjectName("btn_6") 100 | self.gridLayout.addWidget(self.btn_6, 4, 2, 1, 1) 101 | self.btn_moins = QtWidgets.QPushButton(form_calculatrice) 102 | self.btn_moins.setMinimumSize(QtCore.QSize(64, 64)) 103 | self.btn_moins.setMaximumSize(QtCore.QSize(64, 64)) 104 | font = QtGui.QFont() 105 | font.setPointSize(12) 106 | font.setWeight(75) 107 | font.setBold(True) 108 | self.btn_moins.setFont(font) 109 | self.btn_moins.setFlat(True) 110 | self.btn_moins.setObjectName("btn_moins") 111 | self.gridLayout.addWidget(self.btn_moins, 4, 3, 1, 1) 112 | self.btn_1 = QtWidgets.QPushButton(form_calculatrice) 113 | self.btn_1.setMinimumSize(QtCore.QSize(64, 64)) 114 | self.btn_1.setMaximumSize(QtCore.QSize(64, 64)) 115 | font = QtGui.QFont() 116 | font.setPointSize(12) 117 | font.setWeight(75) 118 | font.setBold(True) 119 | self.btn_1.setFont(font) 120 | self.btn_1.setFlat(True) 121 | self.btn_1.setObjectName("btn_1") 122 | self.gridLayout.addWidget(self.btn_1, 5, 0, 1, 1) 123 | self.btn_2 = QtWidgets.QPushButton(form_calculatrice) 124 | self.btn_2.setMinimumSize(QtCore.QSize(64, 64)) 125 | self.btn_2.setMaximumSize(QtCore.QSize(64, 64)) 126 | font = QtGui.QFont() 127 | font.setPointSize(12) 128 | font.setWeight(75) 129 | font.setBold(True) 130 | self.btn_2.setFont(font) 131 | self.btn_2.setFlat(True) 132 | self.btn_2.setObjectName("btn_2") 133 | self.gridLayout.addWidget(self.btn_2, 5, 1, 1, 1) 134 | self.btn_3 = QtWidgets.QPushButton(form_calculatrice) 135 | self.btn_3.setMinimumSize(QtCore.QSize(64, 64)) 136 | self.btn_3.setMaximumSize(QtCore.QSize(64, 64)) 137 | font = QtGui.QFont() 138 | font.setPointSize(12) 139 | font.setWeight(75) 140 | font.setBold(True) 141 | self.btn_3.setFont(font) 142 | self.btn_3.setFlat(True) 143 | self.btn_3.setObjectName("btn_3") 144 | self.gridLayout.addWidget(self.btn_3, 5, 2, 1, 1) 145 | self.btn_plus = QtWidgets.QPushButton(form_calculatrice) 146 | self.btn_plus.setMinimumSize(QtCore.QSize(64, 64)) 147 | self.btn_plus.setMaximumSize(QtCore.QSize(64, 64)) 148 | font = QtGui.QFont() 149 | font.setPointSize(12) 150 | font.setWeight(75) 151 | font.setBold(True) 152 | self.btn_plus.setFont(font) 153 | self.btn_plus.setFlat(True) 154 | self.btn_plus.setObjectName("btn_plus") 155 | self.gridLayout.addWidget(self.btn_plus, 5, 3, 1, 1) 156 | self.btn_0 = QtWidgets.QPushButton(form_calculatrice) 157 | self.btn_0.setMinimumSize(QtCore.QSize(64, 64)) 158 | self.btn_0.setMaximumSize(QtCore.QSize(64, 64)) 159 | font = QtGui.QFont() 160 | font.setPointSize(12) 161 | font.setWeight(75) 162 | font.setBold(True) 163 | self.btn_0.setFont(font) 164 | self.btn_0.setFlat(True) 165 | self.btn_0.setObjectName("btn_0") 166 | self.gridLayout.addWidget(self.btn_0, 6, 1, 1, 1) 167 | self.btn_point = QtWidgets.QPushButton(form_calculatrice) 168 | self.btn_point.setMinimumSize(QtCore.QSize(64, 64)) 169 | self.btn_point.setMaximumSize(QtCore.QSize(64, 64)) 170 | font = QtGui.QFont() 171 | font.setPointSize(12) 172 | font.setWeight(75) 173 | font.setBold(True) 174 | self.btn_point.setFont(font) 175 | self.btn_point.setFlat(True) 176 | self.btn_point.setObjectName("btn_point") 177 | self.gridLayout.addWidget(self.btn_point, 6, 2, 1, 1) 178 | self.btn_egal = QtWidgets.QPushButton(form_calculatrice) 179 | self.btn_egal.setMinimumSize(QtCore.QSize(64, 64)) 180 | self.btn_egal.setMaximumSize(QtCore.QSize(64, 64)) 181 | font = QtGui.QFont() 182 | font.setPointSize(12) 183 | font.setWeight(75) 184 | font.setBold(True) 185 | self.btn_egal.setFont(font) 186 | self.btn_egal.setFlat(True) 187 | self.btn_egal.setObjectName("btn_egal") 188 | self.gridLayout.addWidget(self.btn_egal, 6, 3, 1, 1) 189 | self.le_resultat = QtWidgets.QLineEdit(form_calculatrice) 190 | font = QtGui.QFont() 191 | font.setPointSize(20) 192 | font.setWeight(75) 193 | font.setBold(True) 194 | self.le_resultat.setFont(font) 195 | self.le_resultat.setFrame(False) 196 | self.le_resultat.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 197 | self.le_resultat.setObjectName("le_resultat") 198 | self.gridLayout.addWidget(self.le_resultat, 1, 0, 1, 4) 199 | self.le_operation = QtWidgets.QLineEdit(form_calculatrice) 200 | font = QtGui.QFont() 201 | font.setPointSize(20) 202 | font.setWeight(75) 203 | font.setBold(True) 204 | self.le_operation.setFont(font) 205 | self.le_operation.setFrame(False) 206 | self.le_operation.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 207 | self.le_operation.setObjectName("le_operation") 208 | self.gridLayout.addWidget(self.le_operation, 0, 0, 1, 4) 209 | self.btn_div = QtWidgets.QPushButton(form_calculatrice) 210 | self.btn_div.setMinimumSize(QtCore.QSize(64, 64)) 211 | self.btn_div.setMaximumSize(QtCore.QSize(64, 64)) 212 | font = QtGui.QFont() 213 | font.setPointSize(12) 214 | font.setWeight(75) 215 | font.setBold(True) 216 | self.btn_div.setFont(font) 217 | self.btn_div.setFlat(True) 218 | self.btn_div.setObjectName("btn_div") 219 | self.gridLayout.addWidget(self.btn_div, 2, 3, 1, 1) 220 | 221 | self.retranslateUi(form_calculatrice) 222 | QtCore.QMetaObject.connectSlotsByName(form_calculatrice) 223 | 224 | def retranslateUi(self, form_calculatrice): 225 | form_calculatrice.setWindowTitle(QtWidgets.QApplication.translate("form_calculatrice", "Calculatrice", None, -1)) 226 | self.btn_c.setText(QtWidgets.QApplication.translate("form_calculatrice", "C", None, -1)) 227 | self.btn_7.setText(QtWidgets.QApplication.translate("form_calculatrice", "7", None, -1)) 228 | self.btn_8.setText(QtWidgets.QApplication.translate("form_calculatrice", "8", None, -1)) 229 | self.btn_9.setText(QtWidgets.QApplication.translate("form_calculatrice", "9", None, -1)) 230 | self.btn_mult.setText(QtWidgets.QApplication.translate("form_calculatrice", "*", None, -1)) 231 | self.btn_4.setText(QtWidgets.QApplication.translate("form_calculatrice", "4", None, -1)) 232 | self.btn_5.setText(QtWidgets.QApplication.translate("form_calculatrice", "5", None, -1)) 233 | self.btn_6.setText(QtWidgets.QApplication.translate("form_calculatrice", "6", None, -1)) 234 | self.btn_moins.setText(QtWidgets.QApplication.translate("form_calculatrice", "-", None, -1)) 235 | self.btn_1.setText(QtWidgets.QApplication.translate("form_calculatrice", "1", None, -1)) 236 | self.btn_2.setText(QtWidgets.QApplication.translate("form_calculatrice", "2", None, -1)) 237 | self.btn_3.setText(QtWidgets.QApplication.translate("form_calculatrice", "3", None, -1)) 238 | self.btn_plus.setText(QtWidgets.QApplication.translate("form_calculatrice", "+", None, -1)) 239 | self.btn_0.setText(QtWidgets.QApplication.translate("form_calculatrice", "0", None, -1)) 240 | self.btn_point.setText(QtWidgets.QApplication.translate("form_calculatrice", ".", None, -1)) 241 | self.btn_egal.setText(QtWidgets.QApplication.translate("form_calculatrice", "=", None, -1)) 242 | self.le_resultat.setText(QtWidgets.QApplication.translate("form_calculatrice", "0", None, -1)) 243 | self.btn_div.setText(QtWidgets.QApplication.translate("form_calculatrice", "/", None, -1)) 244 | 245 | -------------------------------------------------------------------------------- /PythonChallenges.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 174 | 175 | -------------------------------------------------------------------------------- /Calculatrice/custom_ui/fenetrePrincipale.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | form_calculatrice 4 | 5 | 6 | 7 | 0 8 | 0 9 | 256 10 | 360 11 | 12 | 13 | 14 | Calculatrice 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 0 22 | 23 | 24 | 0 25 | 26 | 27 | 0 28 | 29 | 30 | 0 31 | 32 | 33 | 34 | 35 | 36 | 64 37 | 64 38 | 39 | 40 | 41 | 42 | 64 43 | 64 44 | 45 | 46 | 47 | 48 | 12 49 | 75 50 | true 51 | 52 | 53 | 54 | C 55 | 56 | 57 | true 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 64 66 | 64 67 | 68 | 69 | 70 | 71 | 64 72 | 64 73 | 74 | 75 | 76 | 77 | 12 78 | 75 79 | true 80 | 81 | 82 | 83 | 7 84 | 85 | 86 | true 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 64 95 | 64 96 | 97 | 98 | 99 | 100 | 64 101 | 64 102 | 103 | 104 | 105 | 106 | 12 107 | 75 108 | true 109 | 110 | 111 | 112 | 8 113 | 114 | 115 | true 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 64 124 | 64 125 | 126 | 127 | 128 | 129 | 64 130 | 64 131 | 132 | 133 | 134 | 135 | 12 136 | 75 137 | true 138 | 139 | 140 | 141 | 9 142 | 143 | 144 | true 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 64 153 | 64 154 | 155 | 156 | 157 | 158 | 64 159 | 64 160 | 161 | 162 | 163 | 164 | 12 165 | 75 166 | true 167 | 168 | 169 | 170 | X 171 | 172 | 173 | true 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 64 182 | 64 183 | 184 | 185 | 186 | 187 | 64 188 | 64 189 | 190 | 191 | 192 | 193 | 12 194 | 75 195 | true 196 | 197 | 198 | 199 | 4 200 | 201 | 202 | true 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 64 211 | 64 212 | 213 | 214 | 215 | 216 | 64 217 | 64 218 | 219 | 220 | 221 | 222 | 12 223 | 75 224 | true 225 | 226 | 227 | 228 | 5 229 | 230 | 231 | true 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 64 240 | 64 241 | 242 | 243 | 244 | 245 | 64 246 | 64 247 | 248 | 249 | 250 | 251 | 12 252 | 75 253 | true 254 | 255 | 256 | 257 | 6 258 | 259 | 260 | true 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 64 269 | 64 270 | 271 | 272 | 273 | 274 | 64 275 | 64 276 | 277 | 278 | 279 | 280 | 12 281 | 75 282 | true 283 | 284 | 285 | 286 | - 287 | 288 | 289 | true 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 64 298 | 64 299 | 300 | 301 | 302 | 303 | 64 304 | 64 305 | 306 | 307 | 308 | 309 | 12 310 | 75 311 | true 312 | 313 | 314 | 315 | 1 316 | 317 | 318 | true 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 64 327 | 64 328 | 329 | 330 | 331 | 332 | 64 333 | 64 334 | 335 | 336 | 337 | 338 | 12 339 | 75 340 | true 341 | 342 | 343 | 344 | 2 345 | 346 | 347 | true 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 64 356 | 64 357 | 358 | 359 | 360 | 361 | 64 362 | 64 363 | 364 | 365 | 366 | 367 | 12 368 | 75 369 | true 370 | 371 | 372 | 373 | 3 374 | 375 | 376 | true 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 64 385 | 64 386 | 387 | 388 | 389 | 390 | 64 391 | 64 392 | 393 | 394 | 395 | 396 | 12 397 | 75 398 | true 399 | 400 | 401 | 402 | + 403 | 404 | 405 | true 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 64 414 | 64 415 | 416 | 417 | 418 | 419 | 64 420 | 64 421 | 422 | 423 | 424 | 425 | 12 426 | 75 427 | true 428 | 429 | 430 | 431 | 0 432 | 433 | 434 | true 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 64 443 | 64 444 | 445 | 446 | 447 | 448 | 64 449 | 64 450 | 451 | 452 | 453 | 454 | 12 455 | 75 456 | true 457 | 458 | 459 | 460 | . 461 | 462 | 463 | true 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 64 472 | 64 473 | 474 | 475 | 476 | 477 | 64 478 | 64 479 | 480 | 481 | 482 | 483 | 12 484 | 75 485 | true 486 | 487 | 488 | 489 | = 490 | 491 | 492 | true 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 20 501 | 75 502 | true 503 | 504 | 505 | 506 | 0 507 | 508 | 509 | false 510 | 511 | 512 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 20 521 | 75 522 | true 523 | 524 | 525 | 526 | false 527 | 528 | 529 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 64 538 | 64 539 | 540 | 541 | 542 | 543 | 64 544 | 64 545 | 546 | 547 | 548 | 549 | 12 550 | 75 551 | true 552 | 553 | 554 | 555 | / 556 | 557 | 558 | true 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | --------------------------------------------------------------------------------