def creation_question(self, donnees): """ Permet de créer un objet Question. PRE : 'donnees' est une liste avec la question comme premier élément, le deuxième élément est la bonne réponse, et les quatres éléments suivants sont les différentes propositions de réponses. POST : Crée la question, puis écrit ses différentes informations dans le fichier du thème associé. """ self.initialisation_question(donnees) try: with open(fct.chemin_absolu(self.__nom_fichier), "a", newline='') as fichier: nouveau_fichier = csv.writer(fichier, quotechar=',') nouveau_fichier.writerow(donnees) except FileNotFoundError: logger.error( 'classe/theme.py : creation_question() : FileNotFoundError : ' + self.__nom_fichier) raise FileNotFoundError('Fichier introuvable.') except IOError: logger.error('classe/theme.py : creation_question() : IOError : ' + self.__nom_fichier) raise IOError('Erreur IO.') logger.info('classe/theme.py : creation_question() : écriture de ' + donnees[0] + " dans " + self.__nom_fichier)
def lancement_application(): """ Démarre l'application. PRE : - POST : Si console : Initialise l'objet librairie avec ses informations, et l'objet joueur. Lance ensuite l'initialisation du jeu, puis l'accès au menu. Si graphique : lance l'interface graphique permettant de voir les scores des joueurs par thème. """ commande = sys.argv if len(commande) != 2: print("Commandes attendues :") print(" pour lancer l'interface console : python main.py console ") print( " pour lancer l'interface graphique : python main.py graphique") elif commande[1] == "console": vb.initialisation_informations() initialisation_bibliotheque() vb.initialisation_joueur() fct.separation() introduction() menu_principal() elif commande[1] == "graphique": dico_scores = fct.recup_donnees_fichier_json( fct.chemin_absolu('ressources/scores.json')) cg.Graphique(dico_scores) else: print("Commandes attendues :") print(" pour lancer l'interface console : python main.py console ") print( " pour lancer l'interface graphique : python main.py graphique")
def suppression_theme(self, theme): """ Permet de supprimer un thème existant. PRE : 'theme' est un objet Theme. POST : Supprime le fichier du thème et le retire du fichier des thèmes et de la liste des objets Themes. """ try: del self.__liste_themes[self.__liste_themes.index(theme)] except ValueError: logger.error( 'classe/bibliotheque.py : suppression_theme() : ValueError : ' + theme.nom_theme) raise ValueError("Clé inconnue") liste_fichiers = [] try: with open(fct.chemin_absolu(self.__nom_fichier_bibliotheque), "r") as fichier_lecture: lire = csv.reader(fichier_lecture) for ligne in lire: if theme.nom_fichier[11:] != (','.join(ligne).rstrip()): liste_fichiers.append(','.join(ligne)) with open(fct.chemin_absolu(self.__nom_fichier_bibliotheque), 'w', newline='') as fichier_ecriture: write = csv.writer(fichier_ecriture) for i in liste_fichiers: write.writerow([i]) except FileNotFoundError: logger.error( 'classe/bibliotheque.py : suppression_theme() : FileNotFoundError : ' + self.__nom_fichier_bibliotheque) raise FileNotFoundError('Fichier introuvable') except IOError: logger.error( 'classe/bibliotheque.py : suppression_theme() : IOError : ' + self.__nom_fichier_bibliotheque) raise IOError('Erreur IO ') os.remove(theme.nom_fichier) logger.info('classe/bibliotheque.py : suppression_theme() : ' + theme.nom_theme)
def creation_theme(self, nom_nouveau_fichier): """ Permet de créer un nouveau thème. PRE : 'nom_nouveau_fichier' est une string. POST : Instancie un objet Theme, crée son fichie, l'ajoute dans le fichier thèmes et dans la liste des objets Theme. """ nouveau_theme = Theme(nom_nouveau_fichier + ".csv") nom_fichier = nouveau_theme.nom_fichier try: with open(fct.chemin_absolu(nom_fichier), 'w', newline='') as csvfile: write = csv.writer(csvfile) write.writerow([ "questions", "bonneReponse", "reponseA", "reponseB", "reponseC", "reponseD" ]) with open(fct.chemin_absolu(self.__nom_fichier_bibliotheque), 'a', newline='') as doss21: write = csv.writer(doss21) write.writerow([nom_fichier[11:]]) except FileNotFoundError: logger.error( 'classe/bibliotheque.py : creation_theme() : FileNotFoundError : ' + nom_fichier) raise FileNotFoundError('Fichier introuvable') except IOError: logger.error( 'classe/bibliotheque.py : creation_theme() : IOError : ' + nom_fichier) raise IOError('Erreur IO ') self.__liste_themes.append(nouveau_theme) self.__dictionnaire_themes[nouveau_theme.nom_theme] = "" logger.info('classe/bibliotheque.py : creation_theme() : ' + nom_fichier)
def introduction(): """ Permet de lancer l'application en accueillant le joueur. PRE : L'objet Utilisateur utilisé via 'joueur' doit avoir été initialisé auparavant. POST : Si le joueur est déjà encodé dans la base, on affiche ses scores précédents. Si il n'est pas encore encodé, son pseudo est enregistré dans l'application. """ dictionnaire = fct.recup_donnees_fichier_json( fct.chemin_absolu('ressources/scores.json')) if vb.joueur.nom not in dictionnaire: dictionnaire[vb.joueur.nom] = vb.joueur.init_resultats() try: with open(fct.chemin_absolu('ressources/scores.json'), 'w') as fichier: nouveau_dictionnaire = json.dumps(dictionnaire) fichier.write(nouveau_dictionnaire) except FileNotFoundError: logger.error( 'options/menu.py : introduction() : FileNotFoundError : ressources/scores.json' ) raise FileNotFoundError('Fichier introuvable.') except IOError: logger.error( 'options/menu.py : introduction() : IOError : ressources/scores.json' ) raise IOError('Erreur IO.') print("Bienvenue dans le jeu.") else: print("Vos scores précédents :\n") for theme_resultats in dictionnaire[vb.joueur.nom]: print(theme_resultats, " : ") for score in dictionnaire[vb.joueur.nom][theme_resultats]: print(" ", score[0], "% - ", score[1]) fct.separation() return dictionnaire
def ajout_score(self, theme, point): """ Permet d'ajouter un score à l'objet Utilisateur. PRE : 'theme' est un objet Theme. 'point' peut être un float ou un int. POST : Ecrit le score dans le fichier contenant l'historique des scores des différents joueurs. """ dico_python = fct.recup_donnees_fichier_json(fct.chemin_absolu('ressources/scores.json')) dico_python[vb.joueur.nom][theme.nom_theme].append([round(point, 2), date.today().strftime('%d/%m/%Y')]) try: with open(fct.chemin_absolu('ressources/scores.json'), 'w') as fichier: dico_json = json.dumps(dico_python) fichier.write(dico_json) except FileNotFoundError: logger.error('classe/utilisateur.py : ajout_score() : FileNotFoundError : ressources/scores.json') raise FileNotFoundError('Fichier introuvable.') except IOError: logger.error('classe/utilisateur.py : ajout_score() : IOError : ressources/scores.json') raise IOError('Erreur IO.') logger.info('classe/utilisateur.py : ajout_score() : ajout de points : ' + str(point) + ", theme : " + theme.nom_theme + ", joueur : " + self.__nom)
def suppression_question(self, question_a_supprimer): """ Permet de supprimer une question. PRE : 'question_a_supprimer' est une string et doit être une clé existante du dictionnaire du thème. POST : Supprime 'question_a_supprimer' et ses réponses associées du fichier du thème associé, ainsi qu'en la supprimant du dictionnaire des questions du thème. """ try: del self.__question_theme[question_a_supprimer] except KeyError: logger.error( 'classe/theme.py : suppression_question() : KeyError : ' + question_a_supprimer) raise KeyError("Clé inconnue") try: with open(fct.chemin_absolu(self.__nom_fichier), "w", newline='') as fichier: nouveau_fichier = csv.writer(fichier, quotechar=',', quoting=csv.QUOTE_MINIMAL) nouveau_fichier.writerow([ "questions", "bonneReponse", "reponseA", "reponseB", "reponseC", "reponseD" ]) for question in self.__question_theme: reponses = self.__question_theme[question] nouveau_fichier.writerow([ question, list(filter(lambda x: x[1] is True, reponses))[0][0], reponses[0][0], reponses[1][0], reponses[2][0], reponses[3][0] ]) except FileNotFoundError: logger.error( 'classe/theme.py : suppression_question() : FileNotFoundError : ' + self.__nom_fichier) raise FileNotFoundError('Fichier introuvable.') except IOError: logger.error( 'classe/theme.py : suppression_question() : IOError : ' + self.__nom_fichier) raise IOError('Erreur IO.') logger.info( 'classe/theme.py : suppression_question() : suppression de ' + question_a_supprimer + " dans " + self.__nom_fichier)
def initialisation_bibliotheque(): """ Initalise les informations de l'application, telles que les thèmes, les questions et les réponses. PRE : Nécessite l'existance de l'objet Bibliotheque, instancié à librairie. POST : Crée les thèmes, les questions, les réponses en tant qu'objet. """ themes = vb.librairie.nom_fichier_bibliotheque for theme in themes: for nom in theme: vb.librairie.initialisation_theme(nom) for theme_fichier in vb.librairie.liste_themes: vb.initialisation_theme(theme_fichier.nom_theme) liste_questions = fct.recup_donnees_fichier( fct.chemin_absolu(vb.theme_courant.nom_fichier)) for question in liste_questions: vb.theme_courant.initialisation_question(question)