Beispiel #1
0
    def temp():
        """
        sous-fonction qui permet de gérer un fichier temporaire qui contiendrat les informations en cours d'enregistrement
        cette sous-fonction est une boucle
        """
        try:  # on essaye d'enregistrer les informations
            read.remplacer_ligne(
                requetes, "temp.txt", 1,
                numero.get("current linestart", "current lineend"))
            read.remplacer_ligne(
                requetes, "temp.txt", 2,
                question_sql.get("current linestart", "current lineend"))

            # on efface toutes les autres lignes pour mettre la requete
            temporaire = read.lire_fichier(requetes + "/temp.txt", True)
            read.suppr_lignes(requetes + "/temp.txt",
                              *[i for i in range(3,
                                                 len(temporaire) + 1)])

            read.remplacer_ligne(
                requetes, "temp.txt", 3,
                requete.get("1.0",
                            "end"))  # on ajoute la requete en cours au fichier

            root.after(100, temp)  # On répète la fonction toutes les 0.1s
        except:  # si on ne peut pas, cela signifie qu'il n'y a plus de fentre et donc la fonction s'arrête
            pass
Beispiel #2
0
def affichage_texte_tkinter(document):
    """
    fonction permettant d'afficher un document texte dans une fenetre tkinter, les sauts de ligne ne sont pas pris en compte
    parametres:
               document, une chaine de caracteres avec le chemin d'acces au document texte
    renvoie une fenêtre tkinter avec le contenu de document
    """
    contenu = read.lire_fichier(document) # On lit le document

    # On transforme la liste de ligne en chaine de caracteres
    contenu_str = ""
    for ligne in contenu:
        contenu_str += ligne + "\n"

    # On parametres une fenetre tkinter
    root = Tk.Tk()
    root.title("Aide")

    # On y ajoute contenu_str dans une zone de texte
    zone_texte = Tk.Text(root, width = 70)
    zone_texte.insert("insert", contenu_str)

    # On affiche le tout
    zone_texte.pack()
    root.mainloop()
Beispiel #3
0
def stockage_question(path, file):
    """
    permet le stockage des questions, réponses et nom de fichier contenu dans un fichier
    parametres:
               path, une chaine de caracteres indiquant le chemin d'accès au dossier avec le fichier cible
               file, une chaine de caracteres avec le nom du fichier cible
    renvoie un dictionnaire avec toutes les informations des requetes
    """
    contenu = read.lire_fichier(path + "/" + file) # On lit le fichier contenant les informations necessaires
    requetes = {}

    i = 1
    while i < len(contenu): # Tant que l'on n'as pas vus l'intégralité des lignes du fichier
        if contenu[i][0] == "#": # si la ligne choisit est une question
            question = contenu[i][1:] # On choisit cette ligne comme étant une question
            sql_file = contenu[i-1] # On choisit la ligne précédente comme étant le fichier répondant à cette question ( ici les .sql)

            # On détermine le numero de la question
            numero = ""
            k = 0
            while question[k] in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]: # on détermine le numero de la question
                numero += question[k]
                k += 1

            # On détermine la réponse à la question
            reponse = ""
            while i+2 < len(contenu) and contenu[i+2][0] != "#": # tant que l'on n'est pas juste avant la prochaine question, on est dans la réponse précédente
                reponse += contenu[i+1] + "\n"
                i += 1

        i+=1
        requetes[int(numero)] = [question, reponse, sql_file] # On ajoute les informations prises dans le dictionnaire de stockage

    return requetes
Beispiel #4
0
def credit():
    """
    fonction permettant d'effectuer l'affichage des crédits
    renvoie une fenetre tkinter avec les crédits
    """
    texte_liste = read.lire_fichier("credits.md", True)
    texte = ""
    for t in texte_liste:
        texte += t + "\n"
    tk.affichage_texte_tkinter("credits", texte, len_maximum(texte_liste) + 2)
Beispiel #5
0
def aide():
    """
    fonction permettant d'effectuer l'affichage de l'aide
    renvoie une fenetre tkinter avec l'aide
    """
    texte_liste = read.lire_fichier("README.md", True)
    texte = ""
    for t in texte_liste:
        texte += t + "\n"
    tk.affichage_texte_tkinter("aide", texte, len_maximum(texte_liste) + 2)
Beispiel #6
0
    def validation():
        """
        sous-fonction permettant de :
            connaître les cases cochées
            retirer les requetes associée aux cases cochées
        """
        suppr = cases_cochees()

        if messagebox.askyesno(
                "Validation",
                "Est-tu sûr de vouloir supprimer (pour toujours) les questions :"
                + str(suppr)):
            alire = [0] + read.lire_fichier(
                "requetes/alire.md", True
            )  # l'ajout de la premiere valeur permet d'être en accrod sur le décompte avec la fonction read.suppr_lignes

            i_lignes = [
            ]  # on va stocker ici la liste des lignes à supprimer du document alire.md

            for n_question in suppr:  # on parcours chaque questions sélectionner

                # on avance le compteur l des indices tant qu'on n'est pas sur la bonne question
                l = 1
                while alire[l][:len(n_question)] != n_question:
                    l += 1

                # on supprime le fichier sql associé qui se trouve une ligne au dessus
                read.suppr_fichier("requetes/" + alire[l - 1], False)
                i_lignes += [l - 1]

                # la détection se fait par la précence de # donc on enleve manuellement le premier
                i_lignes += [l]
                l += 1

                # on ajoute les indices tant qu'on n'as pas fini la question
                while l < len(alire) and len(
                        alire[l]) > 0 and alire[l][0] != "#":
                    i_lignes += [l]
                    l += 1

            read.suppr_lignes(
                "requetes/alire.md", *i_lignes
            )  # une fois tous les indices de lignes récoltées, on supprime les lignes

            retour()  # on retourne au menu
Beispiel #7
0
def ajouter(root, dico, requetes, config, base):
    """
    fonction permettant d'ajouter une requête via une fenetre tkinter
    parametres:
        root, une fenetre tkinter
        dico, un dictionnaire du type : {indice de la question : [question, reponse, fichier sql associé], ... }
        requetes, une chaine de caracteres avec le chemin d'accès vers le fichier contenant les requetes
        config, une chaine de caracteres avec le nom du fichier de configuration des requetes
        base, une chaine de caracteres avec le chemin d'accès vers la base de données
    """
    # on enlève ce qui se trouve sur la fenetre
    tk.clean(root, "Menu")
    root.title("Ajout de requête")
    renseignement = [False, False, False]

    # ensemble des tooltips de champs et des verification de champs
    def numero_verifier(event):
        """
        sous-fonction qui permet de vérifier que le champs pour l'indice est correcte
        """
        try:  # on tente d'obtenir un entier avec le contenu du champs
            nbr = int(numero.get("current linestart", "current lineend"))
            if nbr in dico.keys():
                renseignement[0] = False
                n_texte.set("L'indice indiqué existe déjà")
            else:
                renseignement[0] = True
                if nbr < 10:  # on fait en sorte de toujours écrire les nombres avec 2 chiffres minimum : 1 -> 01
                    numero.delete("current linestart", "current lineend")
                    numero.insert("current linestart", "0" + str(nbr))
                n_texte.set("")
        except:  # si ca ne marche pas, les conditions ne sont pas remplis : erreur
            renseignement[0] = False
            n_texte.set("L'indice de la requetes doit être un entier")

    def question_verifier(event):
        """
        sous-fonction qui permet de vérifier que le champs pour la question est correcte
        """
        texte = question_sql.get(
            "current linestart", "current lineend"
        )  # on prend la question du premier au dernier caracteres de la ligne

        lettres = caracteres(
            texte
        )  # on liste les caracteres du champs pour voir si il y a quelque chose d'écrit (autre que des espaces)

        if texte == "" or (len(lettres) == 1 and lettres[0]
                           == " "):  # On regarde si le champs n'est pas vide
            renseignement[1] = False
            q_texte.set("La requete doit posséder une question/sujet/énoncé")
        else:
            renseignement[1] = True
            q_texte.set("")

    def requete_verifier(event):
        """
        sous-fonction qui permet de vérifier que le champs pour la requete est correcte
        """
        texte = requete.get(
            "1.0", "end"
        )  # on prend la requete du premier caracteres jusqu'au dernier
        lettres = caracteres(texte)

        data = Database.database(
            base)  # on met en route la base de données pour tester

        if data.execute(
                texte
        ) == None:  # si on obtient None, la requete ne s'est pas exécuté est donc elle est fausse
            renseignement[2] = False
            r_texte.set("La requete n'est pas valide, veuillez corriger")
        elif len(lettres) < 3 and (
                " " in lettres or "\n" in lettres
        ):  # si la requete ne contient que des espaces, elle peut s'éxécuter, ce cas est donc détaillé
            renseignement[2] = False
            r_texte.set("Veuillez écrire une requête")
        else:
            renseignement[2] = True
            r_texte.set("")

    def incrementation():
        """
        sous-fonction permettant le remplissage automatique du champs 'indice de la requete'
        """
        indice = [t for t in dico.keys()]
        i_max = max(indice)

        numero.delete("1.0", "end")
        numero.insert("insert", str(i_max + 1))

    def validation():
        """
        sous-fonction permettant de faire la validation des conditions et d'ajouter la requête au fichier
        """
        # on effectue une vérification pour chaque champs
        numero_verifier("valider")
        question_verifier("valider")
        requete_verifier("valider")

        # on affiche une erreur si une condition n'est pas remplie
        if renseignement[
                0] == False:  # l'indice indiquer ne contient autre chose que des chiffres ou est vide
            messagebox.showerror(
                "Indice",
                "Seules les chiffres sont autorisées pour les indices. Aucun espace, aucune lettres ou caractère spécial n'est autorisé"
            )

        elif renseignement[1] == False:  # la question est inexistante
            messagebox.showerror(
                "Question",
                "Un énoncé, un sujet ou une question doit être fourni pour toutes requête ajouté"
            )

        elif renseignement[2] == False:  # la requete n'est pas bonne
            messagebox.showerror(
                "Requête SQL",
                "La requête SQL n'est pas fonctionelle, veuillez corriger votre requete"
            )

        else:
            read.suppr_fichier(requetes + "\temp.txt", False)

            index = numero.get("current linestart", "current lineend")

            texte_requete = requete.get("1.0", "end")
            question_sujet = "#" + index + "." + question_sql.get("1.0", "end")
            sql_file = "req" + str(
                int(index)
            ) + ".sql"  # le str(int permet de transformer les nombre du type 01 en 1

            read.add_fichier(
                requetes, sql_file, texte_requete
            )  # on cree un fichier .sql en écriture pour ajouter la requete

            read.add_ligne(
                requete, config,
                "\n \n" + sql_file + "\n" + question_sujet + texte_requete
            )  # on ajoute les données de la requete dans le fichier de configuration

            retour()  # on retourne sur l'écran principal

    def retour(event=""):
        """
        sous-fonction permettant de revenir au menu principal
        """
        question(root, requetes, config, base)

    def temp():
        """
        sous-fonction qui permet de gérer un fichier temporaire qui contiendrat les informations en cours d'enregistrement
        cette sous-fonction est une boucle
        """
        try:  # on essaye d'enregistrer les informations
            read.remplacer_ligne(
                requetes, "temp.txt", 1,
                numero.get("current linestart", "current lineend"))
            read.remplacer_ligne(
                requetes, "temp.txt", 2,
                question_sql.get("current linestart", "current lineend"))

            # on efface toutes les autres lignes pour mettre la requete
            temporaire = read.lire_fichier(requetes + "/temp.txt", True)
            read.suppr_lignes(requetes + "/temp.txt",
                              *[i for i in range(3,
                                                 len(temporaire) + 1)])

            read.remplacer_ligne(
                requetes, "temp.txt", 3,
                requete.get("1.0",
                            "end"))  # on ajoute la requete en cours au fichier

            root.after(100, temp)  # On répète la fonction toutes les 0.1s
        except:  # si on ne peut pas, cela signifie qu'il n'y a plus de fentre et donc la fonction s'arrête
            pass

    # affichage pour la demande de l'indice
    Tk.Label(root, text="Indice de la question :").grid(row=0,
                                                        column=0,
                                                        sticky="w")
    Tk.Button(root, text="Incrémentation automatique",
              command=incrementation).grid(row=0, column=1, sticky="e")
    numero = Tk.Text(root, height=1, width=100)
    numero.bind("<Leave>", numero_verifier)
    numero.grid(row=1, column=0, columnspan=2)

    # affichage en cas d'erreur d'indice
    n_texte = Tk.StringVar()
    erreur_numero = Tk.Label(root, text="", fg="red", textvariable=n_texte)
    erreur_numero.grid(row=2, column=0, sticky="w")

    # affichage pour la demande de la question
    Tk.Label(root, text="Question posée : ").grid(row=3, column=0, sticky="w")
    question_sql = Tk.Text(root, height=1, width=100)
    question_sql.bind("<Leave>", question_verifier)
    question_sql.grid(row=4, column=0, columnspan=2)

    # affichage en cas d'abcence de question
    q_texte = Tk.StringVar()
    erreur_question = Tk.Label(root, text="", fg="red", textvariable=q_texte)
    erreur_question.grid(row=5, column=0, sticky="w")

    # affichage pour la demande de la requête
    Tk.Label(root, text="Requete SQL :").grid(row=6, column=0, sticky="w")
    requete = Tk.Text(root, height=10, width=100)
    requete.bind("<Leave>", requete_verifier)
    requete.grid(row=7, column=0, columnspan=2)

    # affichage en cas de problemes avec la requete
    r_texte = Tk.StringVar()
    erreur_requete = Tk.Label(root, text="", fg="red", textvariable=r_texte)
    erreur_requete.grid(row=8, column=0, sticky="w")

    # affichage d'un bouton de validation et de retour
    Tk.Button(root, text="valider", command=validation, width=20,
              height=5).grid(row=9, column=0, sticky="w")
    Tk.Button(root, text="retour", command=retour, width=20,
              height=5).grid(row=9, column=1, sticky="e")

    # on vérifie si une requete n'été pas déjà en cours, si oui, on la charge, sinon, on crée le fichier temp.txt
    if read.fichier_existe(requetes + "/temp.txt"):
        temporaire = read.lire_fichier(requetes + "/temp.txt", True)

        numero.insert("current linestart", temporaire[0])
        question_sql.insert("current linestart", temporaire[1])

        req = ""
        for ligne in temporaire[2:]:
            req += ligne + "\n"

        requete.insert("1.0", req)

        numero_verifier("")
        question_verifier("")
        requete_verifier("")
    else:
        read.add_fichier(requetes, "temp.txt")

    root.bind("<Escape>", retour)
    temp()