Calculatrice multi-bases [interface graphique]

Soyez le premier à donner votre avis sur cette source.

Vue 7 968 fois - Téléchargée 1 153 fois

Description

Calculatrice en interface graphique tkinter pour réaliser des calculs et des conversions dans les bases les plus utilisées.

Désolé la taille du code est très conséquente, c'est pourquoi il est découpé en deux parties, le deuxième fichier étant chez nous appelé "fonctionsMaGe.py".

Vous pouvez télécharger les fichiers pré-découpés grâce au .zip en fin de page. Si vous appréciez notre travail une NOTE est la bienvenue, ainsi qu'un commentaire.

Les signes étranges tels que ╠ proviennent du codage du site et non de notre code source. Ils représentent en réalité des caractères spéciaux.

Vous pouvez bien sûr réutiliser et modifier ce code en respectant notre copyright. Le lien pour télécharger l'exécutable est dans la conclusion et est garanti 100% sans virus.

Vos commentaires, notes, remarques et questions sont les bienvenus.

Merci :)

Source / Exemple :


from tkinter import *         #Module pour l'interface graphique
from math import *            #Module pour les fonctions mathématiques
from fonctionsMaGe import *   #Module contenant les fonctions du programme

def copie():                  #Fonction servant à copier le résultat de l'utilisateur               
    global tt                 #Définit une variable réutilisable dans d'autres fonctions
    tt=str(res)               #Rentre dans la variable tt la chaîne de caractères correspondant au résultat
     
def colle():                  #Fonction servant à coller le résultat de l'utilisateur
    try:                      #try permet de faire des exceptions en fonction de ce qui suit                                        
        getSaisie1=saisie1.get()                    #Définit une variable qui prend comme valeur le contenu de la saisie à l'aide de .get()                
        saisie1.delete(0,END)                       #Supprime le contenu existant de la saisie à l'aide de .delete()              
        saisie1.insert(INSERT, tt)                  #Insert dans la saisie le nouveau résultat contenu dans la variable global tt à l'aide de .insert(INSERT, )            
    except NameError:                               #Permet d'exclure une/plusieurs erreur(s) et d'effectuer alors des instructions
        saisie1.insert(INSERT, getSaisie1)          #Insert dans la saisie le contenu de la variable getSaisie1 à l'aide de .insert(INSERT, )
        saisie1.selection_range(0, END)             #Sélectionne le contenu de la saisie du début à la fin à l'aide de .selection_range(0, END)         
        fen2=Toplevel()                             #Créé une fenêtre qui ne sera pas la fenêtre principale avec comme nom fen2                      
        fen2.title('FATAL ERROR')                   #Donne un titre à cette fenêtre à l'aide de .title('le titre ici')            
        fen2.resizable(0,0)                         #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)                   
        fen2.configure(bg='Gainsboro')              #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')     
        Label(fen2,text="╠═══════════{ERREUR !}═══════════╣", bg='Gainsboro').pack()            #Créé du texte Label=(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='')et le place dans la fenêtre avec .pack()
        Label(fen2,text="Pas de résultat à coller !", bg='Gainsboro').pack()                    #Créé du texte Label=(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='')et le place dans la fenêtre avec .pack()         
        fen2.focus()                                                                            #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()                                                                   
        fen2.mainloop()                                                                         #Evite que la fenêtre ne se ferme intempestivement                                                                 

def colleConvert():                                 #Fonction servant à coller le résultat dans le convertisseur
    try:                                            #try permet de faire des exceptions en fonction de ce qui suit                                     
        getEsaisie=Esaisie.get()                    #Définit une variable qui prend comme valeur le contenu de la saisie à l'aide de .get()
        Esaisie.delete(0,END)                       #Supprime le contenu existant de la saisie à l'aide de .delete()                  
        Esaisie.insert(INSERT, tt)                  #Insert dans la saisie le nouveau résultat contenu dans la variable global tt à l'aide de .insert(INSERT, )
    except NameError:                               #Permet d'exclure une certaine erreur et d'effectuer alors des opérations                       
        Esaisie.insert(INSERT, getEsaisie)          #Insert dans la saisie le contenu de la variable getEsaisie à l'aide de .insert(INSERT, )
        Esaisie.selection_range(0, END)             #Sélectionne le contenu de la saisie du début à la fin à l'aide de .selection_range(0, END)
        fen2=Toplevel()                             #Créé une fenêtre qui ne sera pas la fenêtre principale avec comme nom fen2                        
        fen2.title('FATAL ERROR')                   #Donne un titre à cette fenêtre à l'aide de .title()            
        fen2.resizable(0,0)                         #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)                   
        fen2.configure(bg='Gainsboro')              #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')     
        Label(fen2,text="╠═══════════{ERREUR !}═══════════╣", bg='Gainsboro').pack()            #Créé du texte Label=(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='')et le place dans la fenêtre avec .pack()
        Label(fen2,text="Pas de résultat à coller !", bg='Gainsboro').pack()                    #Créé du texte Label=(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='')et le place dans la fenêtre avec .pack()         
        fen2.focus()                                                                            #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()                                                                   
        fen2.mainloop()                                                                         #Evite que la fenêtre ne se ferme intempestivement                                                                 
                                    

def center_window(w, h):                            #Fonction pour centrer la fenêtre principale, prend en arguments la largeur et la hauteur
    ws = fen.winfo_screenwidth()                    #Définit une variable qui prend comme valeur la largeur de l'écran               
    hs = fen.winfo_screenheight()                   #Définit une variable qui prend comme valeur la hauteur de l'écran         
    x = (ws/2) - (w/2)                              #Détermine la nouvelle coordonnée largeur                        
    y = (hs/2) - (h/2)                              #Détermine la nouvelle coordonnée hauteur
    fen.geometry('%dx%d+%d+%d' % (w, h, x, y))      #Donne à la fenêtre ses nouvelles dimensions et sa nouvelle place à l'aide de .geometry()  

def resultat():                                     #Fonction servant à afficher le résultat des calculs
    global res                                      #Variable utilisable dans tout le programme
    a12,b12=saisie1.get(),saisie2.get()             #Définit deux variables qui prennent comme valeur le contenu des saisies de l'utilisateur         
    x,y=ope.get(),base.get()                        #Définit deux variables qui prennent comme valeur l'opération choisie et la base séléctionnée                    
    couple=(x,y)                                    #Définit une variable qui prend comme valeur le couple de variable (x,y)
    try:                                            #try permet de faire des exceptions en fonction de ce qui suit
        if x==0:                                    #Test de conditions avec 'if ... :'
            res="Erreur : Vous n'avez sélectionné aucune opération à effectuer"         #Donne comme valeur à la variable res une chaîne de caractères
        if couple==(1,1):                           #Test de conditions avec 'if ... :'
            res=additionbin(a12,b12)                #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(2,1):                           #Test de conditions avec 'if ... :'
            res=soustractionbin(a12,b12)            #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(3,1):                           #Test de conditions avec 'if ... :'
            res=multiplicationbin(a12,b12)          #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(4,1):                           #Test de conditions avec 'if ... :'
            res=divisionbin(a12,b12)                #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(6,1):                           #Test de conditions avec 'if ... :'
            res=carrebin(a12)                       #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(5,1):                           #Test de conditions avec 'if ... :'
            res=racinebin(a12)                      #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(7,1):                           #Test de conditions avec 'if ... :'
            res=puissancebin(a12,b12)               #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(1,2):                           #Test de conditions avec 'if ... :'
            res=additionhex(a12,b12)                #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(2,2):                           #Test de conditions avec 'if ... :'
            res=soustractionhex(a12,b12)            #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(3,2):                           #Test de conditions avec 'if ... :'
            res=multiplicationhex(a12,b12)          #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(4,2):                           #Test de conditions avec 'if ... :'
            res=divisionhex(a12,b12)                #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(1,3):                           #Test de conditions avec 'if ... :'
            res=addition(a12,b12)                   #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(2,3):                           #Test de conditions avec 'if ... :'
            res=soustraction(a12,b12)               #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(3,3):                           #Test de conditions avec 'if ... :'
            res=multiplication(a12,b12)             #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(4,3):                           #Test de conditions avec 'if ... :'
            res=division(a12,b12)                   #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(5,3):                           #Test de conditions avec 'if ... :'
            res=racine(a12)                         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(6,3):                           #Test de conditions avec 'if ... :'
            res=carre(a12)                          #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(7,3):                           #Test de conditions avec 'if ... :'
            res=puissance(a12,b12)                  #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(6,2):                           #Test de conditions avec 'if ... :'
            res=carrehex(a12)                       #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(5,2):                           #Test de conditions avec 'if ... :'
            res=racinehex(a12)                      #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(7,2):                           #Test de conditions avec 'if ... :'
            res=puissancehex(a12,b12)               #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(1,4):                           #Test de conditions avec 'if ... :'
            res=additionoct(a12,b12)                #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(2,4):                           #Test de conditions avec 'if ... :'
            res=soustractionoct(a12,b12)            #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(3,4):                           #Test de conditions avec 'if ... :'
            res=multiplicationoct(a12,b12)          #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(4,4):                           #Test de conditions avec 'if ... :'
            res=divisionoct(a12,b12)                #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(6,4):                           #Test de conditions avec 'if ... :'
            res=carreoct(a12)                       #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(5,4):                           #Test de conditions avec 'if ... :'
            res=racineoct(a12)                      #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
        if couple==(7,4):                           #Test de conditions avec 'if ... :'
            res=puissanceoct(a12,b12)               #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
    except (NameError, ValueError, SyntaxError, TypeError):    #Permet d'exclure une/plusieurs erreur(s) et d'effectuer alors des instructions
        res='Erreur : Vous avez fait une erreur de syntaxe'     #En cas d'erreur de syntaxe entre les bases, affiche un message d'erreur
    fen2=Toplevel()                                             #Créé une fenêtre qui ne sera pas la fenêtre principale avec comme nom fen2
    fen2.title('')                                              #Donne un titre à cette fenêtre à l'aide de .title()
    fen2.resizable(0,0)                                         #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
    fen2.configure(bg='Gainsboro')                              #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    Label(fen2,text="╠═══════════{Résultat}═══════════╣", bg='Gainsboro').pack()        #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='')et le place dans la fenêtre avec .pack()
    Message(fen2,text=res, bg='Gainsboro', width=600).pack()                            #Créé du texte Message(text='') avec les mêmes propriétés que Label mais ira à la ligne automatiquement
    buttonCopie=Button(fen2, text='Copier', command=copie, bg='Gainsboro', cursor='hand2', activebackground='SkyBlue1') #Créé un bouton, spécifie la fenêtre, le texte, la commande appelée et d'autres attributs        #Créé un bouton en précisant la fenêtre concernée, et lui donne des attributs comme le fond, le curseur, la couleur...
    buttonCopie.pack()                  #Place le bouton dans la fenêtre
    for i in str(res):                  #La structure for permet d'autres test différents de la structure if...else
        if i == 'r':                    #Test de conditions avec 'if ... :'
            buttonCopie.destroy()       #Détruit le widget concerné grâce à .destroy()
    if checkresult(res) == False:       #Test de conditions avec 'if ... :'
        buttonCopie.destroy()           #Détruit le widget concerné grâce à .destroy()
    fen2.focus()                        #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    fen2.mainloop()                     #Evite que la fenêtre ne se ferme intempestivement

def Apropos():
    Apropos=Toplevel()                              #Créé une fenêtre qui ne sera pas la fenêtre principale
    Apropos.resizable(0,0)                          #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
    Apropos.title('A propos')                       #Donne un titre à cette fenêtre à l'aide de .title()                       
    Apropos.configure(background = 'Gainsboro')     #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    a='Calculatrice MaGe ©'                         #Assigne à la variable une chaîne de caractères
    b='~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n'    #Assigne à la variable une chaîne de caractères
    c='Codé et compilé sous Python 3.2.3, fonctionne avec v3.2 ou supérieur.\n'     #Assigne à la variable une chaîne de caractères
    d='Programmeurs et inventeurs : GESNOUIN Joseph / MASSON Bastien\n\n'           #Assigne à la variable une chaîne de caractères
    e='TS1 Lycée Sophie GERMAIN 2013 Tous Droits Réservés ©\n'                      #Assigne à la variable une chaîne de caractères
    f='Toute copie ou tentative de reproduction, même partielle\n et sans autorisation préalable est passible de sanctions pénales\n devant un tribunal compétent.'     #Assigne à la variable une chaîne de caractères
    g='\n\nVersion actuelle : 1.0.0'                                                #Assigne à la variable une chaîne de caractères
    Label(Apropos,text=a, fg='firebrick3',bg='Gainsboro', font=('Courier',16)).pack()               #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    Label(Apropos,text=b+c+d+e+f+g,bg='Gainsboro', fg='darkslateblue', font=('Courier',11)).pack()  #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    Apropos.focus()                 #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    Apropos.mainloop()              #Evite que la fenêtre ne se ferme intempestivement

def docBinaire():
    docBinaire=Toplevel()                           #Créé une fenêtre qui ne sera pas la fenêtre principale
    docBinaire.resizable(0,0)                       #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
    docBinaire.title('Documentation Binaire')       #Donne un titre à cette fenêtre à l'aide de .title()
    docBinaire.configure(background='Gainsboro')    #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    i="         Le Binaire          \n"                                             #Assigne à la variable une chaîne de caractères
    a="Le code binaire, plus généralement appelé système binaire,\n"                #Assigne à la variable une chaîne de caractères
    b="est un système de numération utilisant la base 2 avec un nombre\n"           #Assigne à la variable une chaîne de caractères
    c="exprimé sous forme de série de 0 et de 1. La position des 0 et des 1\n"      #Assigne à la variable une chaîne de caractères
    d="indique respectivement l’absence ou la présence d’une puissance de 2,\n"     #Assigne à la variable une chaîne de caractères
    e="comme le montre l’exemple ci-dessous.\n\n"                                   #Assigne à la variable une chaîne de caractères
    f="100111 = 1x2^5 + 0x2^4 + 0x2^3 + 1x2^2 + 1x2^1 + 1x2^0\n"                    #Assigne à la variable une chaîne de caractères
    g="100111 =  32   +   0   +   0   +   4   +   2   +   1\n"                      #Assigne à la variable une chaîne de caractères
    h="100111 = 39"                                                                 #Assigne à la variable une chaîne de caractères
    Label(docBinaire, text=i, bg='Gainsboro', fg='darkslateblue', font=('Courier',14)).pack()                   #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    Label(docBinaire, text=a+b+c+d+e+f+g+h, bg='Gainsboro', fg='firebrick3', font=('Segoe Print',10)).pack()    #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    docBinaire.focus()              #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    docBinaire.mainloop()           #Evite que la fenêtre ne se ferme intempestivement

def docOctal():
    docOctal=Toplevel()                         #Créé une fenêtre qui ne sera pas la fenêtre principale
    docOctal.resizable(0,0)                     #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
    docOctal.title('Documentation Octale')      #Donne un titre à cette fenêtre à l'aide de .title()
    docOctal.configure(background='Gainsboro')  #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    k="         L'Octal         \n"
    a="Le système de numération octal est le système de numération de \n"                       #Assigne à la variable une chaîne de caractères
    b="base 8, et utilise les chiffres de 0 à 7. D'après l'ouvrage de \n"                       #Assigne à la variable une chaîne de caractères
    c="Donald Knuth, The Art of Computer Programming, il fut inventé par \n"                    #Assigne à la variable une chaîne de caractères
    d="le roi Charles XII de Suède. Mais il est probablement beaucoup plus ancien encore.\n"    #Assigne à la variable une chaîne de caractères
    e="La numération octale peut être construite à partir de la numération \n"                  #Assigne à la variable une chaîne de caractères
    f="binaire en groupant les chiffres consécutifs en triplets \n"                             #Assigne à la variable une chaîne de caractères
    g="(à partir de la droite). Par exemple, la représentation binaire du nombre \n"            #Assigne à la variable une chaîne de caractères
    h="décimal 74 est 1001010, que l'on groupe en 1 001 010 ; ainsi, la \n"                     #Assigne à la variable une chaîne de caractères
    i="représentation octale est 1 pour 1, 1 pour le groupe 001, et 2 pour \n"                  #Assigne à la variable une chaîne de caractères
    j="le groupe 010, ce qui nous donne 112."                                                   #Assigne à la variable une chaîne de caractères
    Label(docOctal, text=k, bg='Gainsboro', fg='darkslateblue', font=('Courier',14)).pack()                   #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    Label(docOctal, text=a+b+c+d+e+f+g+h+i+j, bg='Gainsboro', fg='firebrick3', font=('Segoe Print',10)).pack()    #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    docOctal.focus()                            #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    docOctal.mainloop()                         #Evite que la fenêtre ne se ferme intempestivement

def docHexa():
    docHexa=Toplevel()                          #Créé une fenêtre qui ne sera pas la fenêtre principale
    docHexa.resizable(0,0)                      #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
    docHexa.title('Documentation Hexadécimal')  #Donne un titre à cette fenêtre à l'aide de .title()
    docHexa.configure(background='Gainsboro')   #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    a="         L'Hexadécimal       \n"         #Assigne à la variable une chaîne de caractères
    b="En informatique, se dit d'un système de numération à base 16.\nIl est constitué de 10 chiffres (O,1,2,3,4,5,6,7,8,9) et de\n6 lettres (A,B,C,D,E,F). Il est souvent utilisé pour\nles codes des couleurs en informatique tels que #CC33FF ou #FFFF33"    #Assigne à la variable une chaîne de caractères
    Label(docHexa, text=a, bg='Gainsboro', fg='blue', font=('Courier',14)).pack()               #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    Label(docHexa, text=b, bg='Gainsboro', fg='firebrick3', font=('Segoe Print',10)).pack()     #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    docHexa.focus()                 #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    docHexa.mainloop()              #Evite que la fenêtre ne se ferme intempestivement

def contact():
    contact=Toplevel()                          #Créé une fenêtre qui ne sera pas la fenêtre principale
    contact.resizable(0,0)                      #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
    contact.title('Joindre les auteurs')        #Donne un titre à cette fenêtre à l'aide de .title()
    contact.configure(background='Gainsboro')   #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    a="         Nous contacter          \n"     #Assigne à la variable une chaîne de caractères
    b="Pour toute question sur le programme et son exécution,\n la documentation ou le manuel d'utilisation,\n ou encore pour reporter un bug, envoyer un mail à :\n\n calculmage@gmail.com\n"    #Assigne à la variable une chaîne de caractères
    Label(contact, text=a, fg='darkslateblue',bg='Gainsboro',font=('Courier',14)).pack()        #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    Label(contact, text=b, fg='firebrick3',bg='Gainsboro',font=('Segoe Print',10)).pack()       #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    contact.focus()             #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    contact.mainloop()          #Evite que la fenêtre ne se ferme intempestivement

def modeEmploi():
    modeEmploi=Toplevel()                           #Créé une fenêtre qui ne sera pas la fenêtre principale
    modeEmploi.geometry("650x300+300+0")            #Donne à la fenêtre ses nouvelles dimensions
    modeEmploi.title("Manuel d'utilisation")        #Donne un titre à cette fenêtre à l'aide de .title()
    modeEmploi.configure(background='Gainsboro')    #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    t="     Manuel d'utilisation de la\n    calculatrice Mage ©"        #Assigne à la variable une chaîne de caractères
    Label(modeEmploi, text=t, fg='darkslateblue',bg='Gainsboro',font=('Courier',14)).pack()     #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police, une couleur et une taille de police et le place dans la fenêtre avec .pack()
    frame=Frame(modeEmploi)                 #Frame créé une sous fenêtre utile pour y placer des widgets
    frame.configure(bg='Gainsboro')         #Donne une couleur au fond de la Frame à l'aide de .configure(bg='couleur')
    frame.pack(side=BOTTOM)                 #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    scrollbar = Scrollbar(frame)            #Scrollbar() créé une barre utile pour faire défiler du texte
    scrollbar.pack(side=RIGHT, fill=Y)      #Place la scrollbar et spécifiant le côté et la zone à remplir
    text = Text(frame, wrap=WORD, yscrollcommand=scrollbar.set)                                 #Créé un widget pour afficher du texte compatible avec une Scrollbar
    a='I-UTILISATION DE LA CALCULATRICE\n\nA. Fonctions simples\n\n'                            #Assigne à la variable une chaîne de caractères
    b="L'utilisation de la calcuclatrice MaGe est d'une simplicité étonnante. "                 #Assigne à la variable une chaîne de caractères
    c="Il vous suffit pour effectuer des opérations de base (telles que l'addition, "           #Assigne à la variable une chaîne de caractères
    d="la soustraction, la multiplication ou la division) d'entrer chaque membre "              #Assigne à la variable une chaîne de caractères
    e="de l'opération à effectuer dans chacune des deux entrées texte. En clair, "              #Assigne à la variable une chaîne de caractères
    f="Si vous souhaitez calculer 234*3, entrez 234 dans la 1ère saisie et 3 dans la "          #Assigne à la variable une chaîne de caractères
    g="2ème. Cliquez ensuite sur l'opération de votre choix pour la sélectionner, "             #Assigne à la variable une chaîne de caractères
    h="puis cliquez sur le bouton '->Résultat<-'. Le résultat de votre calcul s'ouvre dans une nouvelle fenêtre. "      #Assigne à la variable une chaîne de caractères
    i="Veuillez noter que les nombres à virgule ne sont autorisés qu'en décimal, et doivent s'écrire avec "             #Assigne à la variable une chaîne de caractères
    i2="un point, non avec une virgule. Pour réutiliser votre résultat, cliquez sur le bouton 'Copier', puis 'Coller' dans la fenêtre principale ou dans le convertisseur.\n\nB. Fonctions avancées\n\nLa calculatrice MaGe comporte aussi "    #Assigne à la variable une chaîne de caractères
    j="des fonctions plus avancées que les simples (+-*/).\nLes fonctions &#8730; et ² ne marchent qu'avec "                  #Assigne à la variable une chaîne de caractères
    k="la saisie de texte principale, sans quoi la fenêtre du résultat affichera une erreur. Les nombres négatifs ne sont autorisés qu'en décimal et certaines exceptions.\n\n"     #Assigne à la variable une chaîne de caractères
    l="C. Changer de base\n\nLa calculatrice MaGe permet des calculs dans différentes bases de nombres, "               #Assigne à la variable une chaîne de caractères
    m="notamment en binaire et en hexadécimal. Changez simplement de base en cliquant "                                 #Assigne à la variable une chaîne de caractères
    n="sur la base souhaitée, au dessus de l'entrée texte principale. Les nombres utilisés "                            #Assigne à la variable une chaîne de caractères
    o="doivent être adaptés en conséquence, par exemple le binaire ne s'écrit qu'avec des 0 et des 1, "                 #Assigne à la variable une chaîne de caractères
    p="en cas de mauvaise syntaxe le programme vous affichera un message d'erreur. Attention donc. "                    #Assigne à la variable une chaîne de caractères
    q="Pour toute information supplémentaire, consultez la doc fournie.\n\n"                                            #Assigne à la variable une chaîne de caractères
    r="II-UTILISATION DU CONVERTISSEUR MULTI-BASES\n\n"                                                                 #Assigne à la variable une chaîne de caractères
    s="Le convertisseur multi-bases MaGe © est accessible même aux non-initiés. Entrez "                                #Assigne à la variable une chaîne de caractères
    u="le nombre à convertir dans la saisie de texte, choisissez la base de départ ainsi "                              #Assigne à la variable une chaîne de caractères
    v="que la base d'arrivée et cliquez sur 'Convertir'. Le résultat s'affiche dans une nouvelle fenêtre. "             #Assigne à la variable une chaîne de caractères
    w="Veuillez notez que les nombres à virgule ne sont pas autorisés, ainsi que les négatifs. "                        #Assigne à la variable une chaîne de caractères
    x="Pour copier ou coller un résultat, utilisez simplement les boutons correspondants."                              #Assigne à la variable une chaîne de caractères
    text.insert(END, a+b+c+d+e+f+g+h+i+i2+j+k+l+m+n+o+p+q+r+s+u+v+w+x)                                                  #Insert dans le widget text les variables correspondantes
    text.config(fg='firebrick3', bg='Gainsboro', font=('Segoe Print',10))                                               #Configure le widget texte avec les mêmes attributs qu'un Label
    text.pack()                                 #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    text.config(state='disabled')               #Ici, empêche la modification par l'utilisateur de la zone de texte
    scrollbar.config(command=text.yview)        #Configure la direction de déplacement du texte quand la scrollbar est utilisée
    modeEmploi.focus()                          #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    modeEmploi.mainloop()                       #Evite que la fenêtre ne se ferme intempestivement

def log():
    log=Toplevel()                          #Créé une fenêtre qui ne sera pas la fenêtre principale
    log.geometry("800x300+300+0")           #Donne à la fenêtre ses nouvelles dimensions
    log.title('Log version')                #Donne un titre à cette fenêtre à l'aide de .title()
    log.configure(background='Gainsboro')   #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    t="Log des changements de versions\n"   #Assigne à la variable une chaîne de caractères
    Label(log, text=t, fg='darkslateblue',bg='Gainsboro',font=('Courier',14)).pack()    #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police et le place dans la fenêtre avec .pack()
    frame1=Frame(log)                                   #Frame créé une sous fenêtre utile pour y placer des widgets
    frame1.configure(background='Gainsboro')            #Donne une couleur au fond de la Frame à l'aide de .configure(bg='couleur')
    frame1.pack(side=BOTTOM)                            #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    scrollbar = Scrollbar(frame1)                       #Scrollbar() créé une barre utile pour faire défiler du texte
    scrollbar.pack(side=RIGHT, fill=Y)                  #Place la scrollbar et spécifiant le côté et la zone à remplir
    text = Text(frame1, wrap=WORD, yscrollcommand=scrollbar.set)    #Créé un widget pour afficher du texte compatible avec une Scrollbar
    d1="1.0.0 -> Fin de la bêta, 1ère version disponible en téléchargement gratuit.\n"                              #Assigne à la variable une chaîne de caractères
    c1="Bêta 0.9.9 -> Ajout des calculs en octal.\n"                                                                #Assigne à la variable une chaîne de caractères
    b1="Bêta 0.9.8 -> Re-pack des boutons de sélection des bases.\n"                                                #Assigne à la variable une chaîne de caractères
    a1="Bêta 0.9.7 -> Ajout de l'octal dans le convertisseur.\n"                                                    #Assigne à la variable une chaîne de caractères
    y="Bêta 0.9.6 -> Fix du bug permettant de supprimer le contenu des scrollbars et améliorations mineures.\n"     #Assigne à la variable une chaîne de caractères
    x="Bêta 0.9.5 -> Correction d'un bug affectant le convertisseur et ajout de couleurs pour les RadioButtons.\n"  #Assigne à la variable une chaîne de caractères
    w="Bêta 0.9.4 -> Ajout du bouton pour copier et réutiliser son résultat, ainsi que dans le convertisseur.\n"    #Assigne à la variable une chaîne de caractères
    v="Bêta 0.9.3 -> Ajout de la fonction puissance dans toutes les bases.\n"                                       #Assigne à la variable une chaîne de caractères
    u="Bêta 0.9.2 -> Fix des bugs affectant le calcul hexadécimal.\n"                                               #Assigne à la variable une chaîne de caractères
    r="Bêta 0.9.0 -> Fix du bug en cas de soustraction négative en binaire et hexadécimal.\n"                       #Assigne à la variable une chaîne de caractères
    q="Bêta 0.8.9 -> Re-pack de la scrollbar du log des changements de version et du mode d'emploi.\n"              #Assigne à la variable une chaîne de caractères
    p="Bêta 0.8.6 -> Fix du bug si l'utilisateur n'avait pas sélectionné d'opérations.\n"                           #Assigne à la variable une chaîne de caractères
    o="Bêta 0.8.0 -> Fix de bugs affectants la conversion.\n"                                                       #Assigne à la variable une chaîne de caractères
    n="Bêta 0.7.6 -> Fixage du bug intervenant en cas de mauvaise syntaxe entre les bases.\n"                       #Assigne à la variable une chaîne de caractères
    m="Bêta 0.7.1 -> Découpage du programme en deux : déplacement des fonctions.\n"                                 #Assigne à la variable une chaîne de caractères
    l="Bêta 0.6.8 -> Intégration complète du convertisseur.\n"                                                      #Assigne à la variable une chaîne de caractères
    k="Bêta 0.6.3 -> Mise en place dans les menus déroulants de l'aide et du convertisseur.\n"                      #Assigne à la variable une chaîne de caractères
    j="Bêta 0.5.7 -> Refonte du design, tous les calculs disponibles dans toutes les bases.\n"                      #Assigne à la variable une chaîne de caractères
    i="Bêta 0.5.2 -> Mise en place de menus déroulants comprenants une doc, les crédits ainsi que la version.\n"    #Assigne à la variable une chaîne de caractères
    h="Bêta 0.4.4 -> Mise en place du message pour les racines négatives, création du convertisseur.\n"             #Assigne à la variable une chaîne de caractères
    g="Bêta 0.3.9 -> Re-package des boutons.\n"                                                                     #Assigne à la variable une chaîne de caractères
    f="Bêta 0.3.6 -> Mise en place des opérations complexes &#8730; et ².\n"                                              #Assigne à la variable une chaîne de caractères
    e="Bêta 0.2.5 -> 1ère remise en place de l'organisation générale de la fenêtre graphique.\n"                    #Assigne à la variable une chaîne de caractères 
    d="Bêta 0.2.2 -> Mise en place du binaire et de l'hexadécimal. Compatibles avec les opérations de base.\n"      #Assigne à la variable une chaîne de caractères
    c="Bêta 0.1.7 -> Mise en place de la fenêtre du résultat.\n"                                                    #Assigne à la variable une chaîne de caractères
    b="Bêta 0.1.3 -> Mise en place des 4 opérations de base, uniquement en décimal.\n"                              #Assigne à la variable une chaîne de caractères
    a="Bêta 0.1.0 -> Mise en place de la fenêtre graphique et des zones de saisie."                                 #Assigne à la variable une chaîne de caractères
    text.insert(END, d1+c1+b1+a1+y+x+w+v+u+r+q+p+o+n+m+l+k+j+i+h+g+f+e+d+c+b+a)         #Insert dans le widget text les variables correspondantes
    text.config(fg='firebrick3', bg='Gainsboro', font=('Segoe Print',10))   #Configure le widget text avec les mêmes attributs qu'un Label
    text.pack()                             #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    text.config(state='disabled')           #Ici, empêche la modification par l'utilisateur de la zone de texte
    scrollbar.config(command=text.yview)    #Configure la direction de déplacement du texte quand la scrollbar est utilisée
    log.focus()                             #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
    log.mainloop()                          #Evite que la fenêtre ne se ferme intempestivement
    
def convertisseurs():
    def convertir():
        global res                              #Variable utilisable dans tout le programme
        saisie=Esaisie.get()                    #Définit une variable qui prend comme valeur le contenu de la saisie à l'aide de .get()
        x,y=basedepart.get(),basearrivee.get()  #Définit deux variables qui prennent comme valeur celle de la base de départ et celle d'arrivée
        couple=(x,y)                            #Définit une variable qui prend comme valeur le couple de variable (x,y)
        try:                                    #try permet de faire des exceptions en fonction de ce qui suit
            if couple==(1,2):               #Test de conditions avec 'if ... :'
                res=dec2bin(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(1,3):             #Test de conditions avec 'elif ... :'
                res=dec2hex(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(2,1):             #Test de conditions avec 'elif ... :'
                res=bin2dec(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(2,3):             #Test de conditions avec 'elif ... :'
                res=bin2hex(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(3,1):             #Test de conditions avec 'elif ... :'
                res=hex2dec(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(3,2):             #Test de conditions avec 'elif ... :'
                res=hex2bin(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(4,1):             #Test de conditions avec 'elif ... :'
                res=oct2dec(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(4,2):             #Test de conditions avec 'elif ... :'
                res=oct2bin(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(4,3):             #Test de conditions avec 'elif ... :'
                res=oct2hex(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(1,4):             #Test de conditions avec 'elif ... :'
                res=dec2oct(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(2,4):             #Test de conditions avec 'elif ... :'
                res=bin2oct(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            elif couple==(3,4):             #Test de conditions avec 'elif ... :'
                res=hex2oct(saisie)         #En fonction des valeurs de couple(x,y), donne à la variable res une fonction à appeler pour obtenir un résultat
            else :                      #else fait partie de la boucle conditionnelle if...elif...else. Else signifie 'sinon'
                res="Erreur : Problème dans la sélection des bases."    #Donne comme valeur à la variable res une chaîne de caractères
        except (NameError, ValueError, SyntaxError, TypeError):                        #Permet d'exclure une/plusieurs erreur(s) et d'effectuer alors des instructions
            res='Erreur : Vous avez fait une erreur de syntaxe'             #Donne comme valeur à la variable res une chaîne de caractères   
        fen2=Toplevel()                             #Créé une fenêtre qui ne sera pas la fenêtre principale
        fen2.configure(background='Gainsboro')      #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
        fen2.resizable(0,0)                         #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
        Label(fen2,text="&#9568;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;{Résultat}&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9571;", bg='Gainsboro').pack()    #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='') et le place dans la fenêtre avec .pack()
        Message(fen2,text=res, bg='Gainsboro', width=600).pack()                        #Message fonctionne comme Label , mais va à la ligne automatiquement
        buttonCopie2=Button(fen2, text='Copier', command=copie, bg='Gainsboro', cursor='hand2', activebackground='SkyBlue1')    #Créé un bouton, spécifie la fenêtre, le texte, la commande appelée et d'autres attributs
        buttonCopie2.pack(side=BOTTOM)      #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
        for i in str(res):                  #La structure for permet d'autres test différents de la structure if...else
            if i == 'r':                    #Test de conditions avec 'if ... :'
                buttonCopie2.destroy()      #Détruit le widget concerné grâce à .destroy()
        if checkresult(res) == False:       #Test de conditions avec 'if ... :'
            buttonCopie2.destroy()          #Détruit le widget concerné grâce à .destroy()
        fen2.focus()                        #Permet à la fenêtre d'être mise au 1er plan à l'aide de .focus()
        fen2.mainloop()                     #Evite que la fenêtre ne se ferme intempestivement
        
    fen=Toplevel()                          #Créé une fenêtre qui ne sera pas la fenêtre principale
    fen.resizable(0,0)                      #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
    fen.title("Convertisseur MaGe ©")       #Donne un titre à cette fenêtre à l'aide de .title()
    fen.configure(bg='Gainsboro')           #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
    Label(fen,text="Entrez la valeur\n que vous souhaitez convertir", bg='Gainsboro').pack(side=TOP)    #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='') et le place dans la fenêtre avec .pack()
    global Esaisie                                  #Définit une variable utilisable dans tout le programme
    Esaisie=Entry(fen)                              #Créé une entrée que l'utilisateur pourra remplir de texte et spécifie la fenêtre concernée
    Esaisie.pack(side=TOP)                          #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    Esaisie.focus()                                 #focus() permet ici de placer directement le curseur à l'intérieur de la zone de texte
    Esaisie.insert(INSERT, 'Votre valeur ici')      #Insert dans la saisie le texte entre guillemets
    Esaisie.selection_range(0, END)                 #Sélectionne le contenu entier de la saisie

    Fgauche=Frame(fen)                                              #Frame créé une sous fenêtre utile pour y placer des widgets
    Fgauche.configure(bg='Gainsboro')                               #Donne une couleur au fond de la Frame à l'aide de .configure(bg='couleur')
    Fgauche.pack(side=LEFT)                                         #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    Label(Fgauche,text="Base de départ", bg='Gainsboro').pack()     #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='') et le place dans la fenêtre avec .pack()
    basedepart=IntVar()                                             #Définit une variable utilisée pour les Radiobuttons
    #Radiobutton créé un bouton qui permet un choix. Il prend comme paramètres un texte, une couleur de fond, une variable et sa valeur. En plus indicatoron change son aspect, width sa largeur, cursor le curseur et activebackground sa couleur quand "cliqué"
    Radiobutton(Fgauche,text="Décimal", bg='Gainsboro',variable=basedepart,value=1,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()
    Radiobutton(Fgauche,text="Binaire", bg='Gainsboro',variable=basedepart,value=2,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()
    Radiobutton(Fgauche,text="Hexadécimal", bg='Gainsboro',variable=basedepart,value=3,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()
    Radiobutton(Fgauche,text="Octal", bg='Gainsboro',variable=basedepart,value=4,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()

    Fdroite=Frame(fen)                                              #Frame créé une sous fenêtre utile pour y placer des widgets
    Fdroite.configure(bg='Gainsboro')                               #Donne une couleur au fond de la Frame à l'aide de .configure(bg='couleur')
    Fdroite.pack(side=RIGHT)                                        #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    Label(Fdroite,text="Base désirée", bg='Gainsboro').pack()       #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='') et le place dans la fenêtre avec .pack()
    basearrivee=IntVar()                                            #Définit une variable utilisée pour les Radiobuttons
    #Radiobutton créé un bouton qui permet un choix. Il prend comme paramètres un texte, une couleur de fond, une variable et sa valeur. En plus indicatoron change son aspect, width sa largeur, cursor le curseur et activebackground sa couleur quand "cliqué"
    Radiobutton(Fdroite,text="Décimal", bg='Gainsboro',variable=basearrivee,value=1,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()
    Radiobutton(Fdroite,text="Binaire", bg='Gainsboro',variable=basearrivee,value=2,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()
    Radiobutton(Fdroite,text="Hexadécimal", bg='Gainsboro',variable=basearrivee,value=3,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()
    Radiobutton(Fdroite,text="Octal", bg='Gainsboro',variable=basearrivee,value=4,indicatoron=0,width=15, cursor='hand2', activebackground='SteelBlue3').pack()
    
    Bconvertir=Button(fen,text="Convertir", bg='Gainsboro',command=convertir, cursor='hand2', activebackground='brown2')    #Créé un bouton, spécifie la fenêtre, le texte, la commande appelée et d'autres attributs
    Bconvertir.pack(side=BOTTOM)        #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    buttonColle=Button(fen, text='Coller', command=colleConvert, bg='Gainsboro', cursor='hand2', activebackground='SkyBlue1')   #Créé un bouton, spécifie la fenêtre, le texte, la commande appelée et d'autres attributs
    buttonColle.pack(side=BOTTOM)       #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
    fen.mainloop()                      #Evite que la fenêtre ne se ferme intempestivement
    
fen=Tk()                                    #Créé une fenêtre qui sera la fenêtre principale
center_window(260, 330)                     #Appelle la fonction qui centre la fenêtre en lui donnant les dimensions désirées            
fen.resizable(0,0)                          #Empêche l'utilisateur de redimmensionner la fenêtre à l'aide de .resizable(0,0)
fen.title('Calculatrice MaGe ©')            #Donne un titre à cette fenêtre à l'aide de .title()
fen.configure(background = 'Gainsboro')     #Donne une couleur au fond de la fenêtre à l'aide de .configure(bg='couleur')
text1=Label(fen,text='Bienvenue\ndans la calculatrice MaGe\n',fg='darkslateblue', bg='Gainsboro', font=('MV Boli',15)).pack(side=TOP)   #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='') et le place dans la fenêtre avec .pack()
Fbottom1=Frame(fen)         #Frame créé une sous fenêtre utile pour y placer des widgets
Fbottom1.pack(side=TOP)     #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
base=IntVar()               #Définit une variable utilisée pour les Radiobuttons
#Radiobutton créé un bouton qui permet un choix. Il prend comme paramètres un texte, une couleur de fond, une variable et sa valeur. En plus indicatoron change son aspect, width sa largeur, cursor le curseur et activebackground sa couleur quand "cliqué"
Radiobutton(Fbottom1,text='Binaire', bg='Gainsboro', font=('Segoe Print', 9),variable=base, value=1, cursor='hand2').pack(side=RIGHT)
Radiobutton(Fbottom1,text='Décimal', bg='Gainsboro', font=('Segoe Print', 9),variable=base, value=3, cursor='hand2').pack(side=RIGHT)
Radiobutton(Fbottom1,text='Décimal', bg='Gainsboro', font=('Segoe Print', 9),variable=base, value=3, cursor='hand2').select() #Sélectionne le Radiobutton

Fbottom2=Frame(fen)         #Frame créé une sous fenêtre utile pour y placer des widgets
Fbottom2.pack(side=TOP)     #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
#Radiobutton créé un bouton qui permet un choix. Il prend comme paramètres un texte, une couleur de fond, une variable et sa valeur. En plus indicatoron change son aspect, width sa largeur, cursor le curseur et activebackground sa couleur quand "cliqué"
Radiobutton(Fbottom2,text='Hexadécimal', bg='Gainsboro', font=('Segoe Print', 9),variable=base, value=2, cursor='hand2').pack(side=RIGHT)
Radiobutton(Fbottom2,text='Octal', bg='Gainsboro', font=('Segoe Print', 9), variable=base, value=4, cursor='hand2').pack(side=RIGHT)    

Label(fen,text='', bg='Gainsboro').pack(side=TOP)      #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='') et le place dans la fenêtre avec .pack()

saisie1=Entry(fen)                              #Créé une entrée que l'utilisateur pourra remplir de texte et spécifie la fenêtre concernée
saisie1.pack(side=TOP)                          #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
saisie1.insert(INSERT, 'Entrée principale')     #Insert dans la saisie le texte entre guillemets
saisie1.selection_range(0, END)                 #Sélectionne le contenu entier de la saisie
Label(fen,text='~~~~~~~~~~', bg='Gainsboro', font=('Segoe Print', 8)).pack(side=TOP)    #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg=''), une police et le place dans la fenêtre avec .pack()
saisie2=Entry(fen)                                      #Créé une entrée que l'utilisateur pourra remplir de texte et spécifie la fenêtre concernée
saisie2.pack(side=TOP)                                  #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
Label(fen,text=' ', bg='Gainsboro').pack(side=TOP)      #Créé du texte Label(text=''), spécifie la fenêtre concernée, donne une couleur de fond (bg='') et le place dans la fenêtre avec .pack()
saisie1.focus()                                         #focus() permet ici de placer directement le curseur à l'intérieur de la zone de texte
    
Resul=Frame(fen)                        #Frame créé une sous fenêtre utile pour y placer des widgets
Resul.configure(bg='Gainsboro')         #Donne une couleur au fond de la Frame à l'aide de .configure(bg='couleur')
Resul.pack(side=BOTTOM)                 #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
buttonColle=Button(Resul, text='-> Coller <-', command=colle, bg='Gainsboro', cursor='hand2', activebackground='SkyBlue1')      #Créé un bouton, spécifie la fenêtre, le texte, la commande appelée et d'autres attributs
buttonColle.pack(side=BOTTOM)           #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
buttonEgal=Button(Resul, text='-> Résultat <-', command=resultat, bg='Gainsboro', cursor='hand2', activebackground='brown2').pack(side=BOTTOM)  #Créé un bouton, spécifie la fenêtre, le texte, la commande appelée et d'autres attributs

Ope=Frame(fen)              #Frame créé une sous fenêtre utile pour y placer des widgets
Ope.pack(side=BOTTOM)       #.pack() permet de placer le widget dans la fenêtre ou la Frame sélectionnée
ope=IntVar()                #Définit une variable utilisée pour les Radiobuttons
#Radiobutton créé un bouton qui permet un choix. Il prend comme paramètres un texte, une couleur de fond, une variable et sa valeur. En plus indicatoron change son aspect, width sa largeur, cursor le curseur et activebackground sa couleur quand "cliqué"
Radiobutton(Ope,text='+',variable=ope, value=1, indicatoron=0, bg='Gainsboro', cursor='hand2', activebackground='SteelBlue3').pack(side=LEFT)
Radiobutton(Ope, text='-',variable=ope, value=2, indicatoron=0, bg='Gainsboro', cursor='hand2', activebackground='SteelBlue3').pack(side=LEFT)
Radiobutton(Ope, text='x',variable=ope, value=3, indicatoron=0, bg='Gainsboro', cursor='hand2', activebackground='SteelBlue3').pack(side=LEFT)
Radiobutton(Ope, text='/',variable=ope, value=4, indicatoron=0, bg='Gainsboro', cursor='hand2', activebackground='SteelBlue3').pack(side=LEFT)
Radiobutton(Ope, text='sqrt',variable=ope, value=5, indicatoron=0, bg='Gainsboro', cursor='hand2', activebackground='SteelBlue3').pack(side=LEFT)
Radiobutton(Ope, text='²',variable=ope, value=6, indicatoron=0, bg='Gainsboro', cursor='hand2', activebackground='SteelBlue3').pack(side=LEFT)
Radiobutton(Ope, text='a^b',variable=ope, value=7, indicatoron=0, bg='Gainsboro', cursor='hand2', activebackground='SteelBlue3').pack(side=LEFT)

mainmenu = Menu(fen)                        #Créé une barre pouvant contenir des menus déroulants
menuApropos = Menu(mainmenu, tearoff=0)     #Créé un onglet dans la barre de menu
menuDoc = Menu(mainmenu, tearoff=0)         #Créé un onglet dans la barre de menu
menuAide = Menu(mainmenu, tearoff=0)        #Créé un onglet dans la barre de menu
menuConv = Menu(mainmenu, tearoff=0)        #Créé un onglet dans la barre de menu
mainmenu.add_cascade(label='Convertir', menu=menuConv)      #Ajoute une cascade pouvant contenir plusieurs options, la nomme et spécifie l'onglet concerné
mainmenu.add_cascade(label='Docs', menu=menuDoc)            #Ajoute une cascade pouvant contenir plusieurs options, la nomme et spécifie l'onglet concerné
mainmenu.add_cascade(label='Aide', menu=menuAide)           #Ajoute une cascade pouvant contenir plusieurs options, la nomme et spécifie l'onglet concerné
mainmenu.add_cascade(label='A propos', menu=menuApropos)    #Ajoute une cascade pouvant contenir plusieurs options, la nomme et spécifie l'onglet concerné
menuConv.add_command(label='Convertisseur multi-bases', command=convertisseurs)     #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué
menuApropos.add_command(label='Crédits et version', command=Apropos)                #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué
menuApropos.add_command(label='Log programmeur', command=log)                       #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué
menuApropos.add_command(label='Contact', command=contact)                           #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué
menuDoc.add_command(label='Le Binaire', command=docBinaire)                         #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué
menuDoc.add_command(label="L'Octal", command=docOctal)                              #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué
menuDoc.add_command(label="L'Hexadecimal", command=docHexa)                         #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué
menuAide.add_command(label="Mode d'emploi", command=modeEmploi)                     #Ajoute un choix pour l'utilisateur et appelle une fonction quand cliqué

fen.config(menu = mainmenu)      #Créé le menu dans la fenêtre convernée

fen.mainloop()                  #Evite que la fenêtre ne se ferme intempestivement

#################################################################
#################################################################
#################################################################
#                     DEBUT MODULE FONCTIONS                    #
#################################################################
#################################################################
#################################################################

from math import sqrt               #Dans le module maths importe la fonction racine carré

#Fonctions décimales
def addition(a12,b12):               #Prend deux variables (a12 et b12) et definit la fonction addition
    a,b = eval(a12), eval(b12)       #Transforme les variables en type nombre précédement chaine de caractères
    c=a+b                            #Donne a une valeur c le résultat de a+b 
    return c                         #Retourne la valeur c
    
def soustraction(a12,b12):           #Prend deux variables (a12 et b12) et définit la fonction soustraction
    a,b=eval(a12),eval(b12)          #Transforme les variables en type nombre précédement chaine de caractère
    c=a-b                            #Donne a une valeur c le résultat de a-b
    return c                         #Retourne la valeur c
        
def multiplication(a12,b12):         #Définit la fonction multiplication (a12 et b12) et définit la fonction multiplication
    a,b=eval(a12),eval(b12)          #Transforme les variables en type nombre
    c=a*b                            #Donne a une valeur c le résultat de a*b 
    return c                         #Affiche la valeur c
    
def division(a12,b12):               #Définit la fonction multiplication (a12 et b12) et définit la fonction division
    a,b=eval(a12),eval(b12)          #Transforme les variables en type nombre
    if b==0:                         #Dans le cas du dénominateur qui vaut 0"
        return 'Erreur : Division par 0'  #Afficher 'Erreur : Division par 0'
    else:                            #Si b!=0
        c,d=a//b,a%b                 #c prend la valeur de la division euclidienne de a par b et d prend la valeur du reste de la division euclidienne de a par b
        return c,'reste de ',d       #Retourne c puis le reste de la division de a par b : d

def racine(a12):                     #Definit la fonction racine carré
    a=eval(a12)                      #a prend la valeur numérique de la variable a12
    if a<0:                          #Dans le cas ou a<0
        return "Erreur : Racine carrée d'un nombre négatif"   #Afficher 'Erreur' puisque impossibilité de calculer une racine négative
    else:                            #Sinon
        c=sqrt(a)                    #c prend la valeur de la racine de la variable a
        c=float(c)                   #c change de type et deviens un nombre à virgule
        return c                     #Retourne c

def carre(a12):                      #Définit la fonction carré
    a=eval(a12)                      #a prend la valeur numérique de la variable a12 précédement chaine de caractères
    return a**2                      #Retourne le nombre a puissance 2                      

def puissance(a,n):                  #Définit la fonction puissance et prend deux variables en entrée le nombre a et sa future puissance n
    if checkpuissance(a,n) == False: #Utilise une des fonctions check pour verrifier la taille du nombre
        y="Erreur : L'une des deux valeurs est trop grande" #y prend comme chaine de caractère "Erreur : L'une des deux valeurs est trop grande"
        return y                     #Retourne y
    a,n=eval(a),eval(n)              #a et n prennent respectivement les valeurs de type nombre des valeurs entrées au départ                  
    return a**n                      #Retourne la valeur numérique a**n

#Fin des fonctions décimales
#Fonctions de calcul binaires

def additionbin(a,b):                #Définit la fonction addition en binaire
    if checkneg2(a) == False or checkneg2(b) == False:    #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend la valeur de type chaine de caractère "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Affiche y
    if checkbin(a) == False or checkbin(b) == False:      #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend la valeur de type chaine de caractère "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    a,b=bin2dec(a),bin2dec(b)                             #a et b prennent la valeur de la fonction qui convertit un nombre binaire en un nombre décimale (pourtant de type string)
    a,b=eval(a),eval(b)                                   #Change le type des variables de a et de b en type nombre
    c=dec2bin(str(a+b))                                   #La variable c prend la valeur de la fonction convertissant un nombre décimal en binaire de la variable du type string de a+b
    return c                                              #Retourne c

def soustractionbin(a,b):                                #Définit la fonction soustraction en binaire
    if checkbin(a) == False or checkbin(b) == False:     #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkneg(a,b) == True:                            #Si la fonction de check pour les négatifs de a ou de b detecte un nombre négatif affiche vrai
        y="Erreur : Le résultat de l'opération est négatif" #y prend comme variable un texte de type string "Erreur : Le résultat de l'opération est négatif"
        return y                                          #Retourne y
    if checkneg2(a) == False or checkneg2(b) == False:   #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"   #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    a,b=bin2dec(str(a)),bin2dec(str(b))                  #Transforme a et b en nombre binaires
    a,b=eval(a),eval(b)                                  #a et b se transforment en type nombre
    c=dec2bin(str(a-b))                                  # c prend la valeur de a-b puis on le transforme en string pour pouvoir passer de c en décimal a c en binaire
    return c                                             #Retourne c

def multiplicationbin(a,b):          #Définit la fonction multiplication en binaire
    if checkneg2(a) == False or checkneg2(b) == False:   #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkbin(a) == False or checkbin(b) == False:     #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    a,b=bin2dec(a),bin2dec(b)                            #a et b se transforment en nombre décimaux
    a,b=eval(a),eval(b)                                  #a et b passent du type string au type nombre
    c=dec2bin(str(a*b))                                  #c prend la valeur de a*b puis passe en type string pour etre convertit de décimal à binaire
    return c                                             #affiche c (en binaire)

def divisionbin(a,b):                #Définit la fonction division en binaire
    if checkneg2(a) == False or checkneg2(b) == False:    #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkbin(a) == False or checkbin(b) == False:      #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    a,b=bin2dec(a),bin2dec(b)                             #a et b se transforment de décimaux à binaires
    a,b=eval(a),eval(b)                                   #a et b passent du type string au type nombre
    if b==0:                                              #Dans le cas ou b serait égal à 0
        return 'Erreur : Division par 0'                  #Retourner 'Erreur : Division par 0'  
    else:                                                 #Sinon 
        c,d=dec2bin(str(a//b)),dec2bin(str(a%b))          #c prend la valeur de la division euclidienne de a par b le tout transformé en binaire et d prend la valeur du reste de la division euclidienne , transformé en binaire
    return c,'Reste de ',d                                #Affiche c puis d

def racinebin(a):                   #Définit la fonction racine en binaire
    if checkneg2(a) == False:                             #Si la fonction de check2 pour le négatif a detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkbin(a) == False:                              #Si la fonction de check pour le nombre binaire détecte un nombre qui n'est pas binaire                              
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    b=bin2dec(a)                                          #b prend la valeur de a et passe de binaire à décimal
    b=int(b)                                              #Transforme b en entier
    c=int(sqrt(int(b)))                                   #C prend la valeur de la racine de l'entier b
    if c**2==b:                                           #Si c au carré vaut b
        c=dec2bin(str(c))                                 #c prend la valeur du type string de c puis se transforme en nombre binaire
        return str(c)                                     #Retourne c qui est en type string
    else:                                                 #Sinon
        return "Erreur : La racine n'est pas un nombre entier" #Retourner "Erreur : La racine n'est pas un nombre entier"

def carrebin(a):                   #Définit la fonction carré en binaire
    if checkneg2(a) == False:                              #Si la fonction de check2 pour le négatif a detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    if checkbin(a) == False:                               #Si la fonction de check pour le nombre binaire détecte un nombre qui n'est pas binaire     
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                            #Retourne y
    a=bin2dec(a)                                           #a prend la valeur de a mais en decimal
    c=int(a)                                               #c prend la valeur de a en entier
    c=dec2bin(str(c**2))                                   #c prend la valeur de c puissance deux transformé en type string dans le but de pouvoir le transformer de decimal à binaire
    return c                                               #Retourne la valeur c

def puissancebin(a,n):             #Définit la fonction puissance en binaire
    if checkneg2(a) == False or checkneg2(n) == False:     #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    if checkbin(a) == False:                               #Si la fonction de check pour le nombre binaire a détecte un nombre qui n'est pas binaire     
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    a,n=int(bin2dec(a)),int(bin2dec(n))                    #a prend la valeur décimale de a (type entier) et n prend la valeur de l'entier décimal de n
    if checkpuissancebin(a,n) == False:                    #Utilise la puissance de check de a et n pour voir si ils ne sont pas trop grands
        y="Erreur : L'une des deux valeurs est trop grande" #y prend la valeur "Erreur : L'une des deux valeurs est trop grande"
        return y                                           #Retourne y
    c=dec2bin(str(a**n))                                   #c prend la valeur de a puissance n transformé en decimal
    return c                                               #Affiche c

#Fin du binaire

#Debut calcul hexa

def additionhex(a12,b12):          #Définit la fonction addition en héxadécimal
    if checkneg2(a12) == False or checkneg2(b12) == False: #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    a,b=eval(hex2dec(a12)),eval(hex2dec(b12))              # a prend la valeur de a12 transformé en décimal puis transformé en type nombre et b également pour b12
    c=dec2hex(str(a+b))                                    #c prend la valeur de a+b transformé en héxadécimal
    return c                                               #Retourne c

def soustractionhex(a12,b12):      #Définit la fonction soustraction en hexadécimal
    if checkneg2(a12) == False or checkneg2(b12) == False: #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    if checkneg(a12,b12)==True:                            #Si la fonction de check pour les négatifs de a ou de b detecte un nombre négatif affiche vrai
        y="Erreur : Le résultat de l'opération est négatif" #y prend comme variable le texte "Erreur : Le résultat de l'opération est négatif"
        return y                                           #Retourne y
    a,b=eval(hex2dec(a12)),eval(hex2dec(b12))              # a prend la valeur de a12 transformé en décimal puis transformé en type nombre et b également pour b12
    a=int(a); b=int(b)                                     #a et b se transforment en type nombre
    c=dec2hex(str(a-b))                                    #c prend la valeur de a-b transformé en héxadécimal                           
    return c                                               #Retourne c

def multiplicationhex(a12,b12):    #Définit la fonction multiplication en héxadécimal
    if checkneg2(a12) == False or checkneg2(b12) == False: #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    a,b=eval(hex2dec(a12)),eval(hex2dec(b12))
    a=int(a); b=int(b)
    c=dec2hex(str(a*b))
    return c

def divisionhex(a12,b12):
    if checkneg2(a12) == False or checkneg2(b12) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    a,b=eval(hex2dec(a12)),eval(hex2dec(b12))
    a=int(a); b=int(b)
    if b==0:
        return 'Erreur : Division par 0'
    else:
        c,d=dec2hex(str(a//b)),dec2hex(str(a%b))
        return c,'et comme reste',d
    
def racinehex(a12):
    if checkneg2(a12) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
    b=hex2dec(a12)
    b=int(b)
    if b<0:
        return "Erreur : Racine carrée d'un nombre négatif"
    else:
        c=int(sqrt(b))
        if c**2==b:
            c=dec2hex(str(c))
            return c
        else:        
            return "Erreur : La racine n'est pas un nombre entier"

def carrehex(a12):
    a=int(hex2dec(a12))
    c=dec2hex(str(a**2))
    return c

def puissancehex(a12,b12):
    if checkneg2(a12) == False or checkneg2(b12) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    a,b=int(hex2dec(a12)),int(hex2dec(b12))
    if checkpuissancehex(a,b) == False:
        y="Erreur : L'une des deux valeurs est trop grande"
        return y
    c=dec2hex(str(a**b))
    return c
#début des fonctions de calcul octales

def additionoct(a,b):
    if checkneg2(a) == False or checkneg2(b) == False:   #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend la valeur de type chaine de caractère "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Affiche y
    if checkoct(a) == False or checkoct(b) == False:      #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend la valeur de type chaine de caractère "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    a,b=oct2dec(a),oct2dec(b)                             #a et b prennent la valeur de la fonction qui convertit un nombre binaire en un nombre décimale (pourtant de type string)
    a,b=eval(a),eval(b)                                   #Change le type des variables de a et de b en type nombre
    c=dec2oct(str(a+b))                                   #La variable c prend la valeur de la fonction convertissant un nombre décimal en binaire de la variable du type string de a+b
    return c                                              #Retourne c
def soustractionoct(a,b):                                 #Définit la fonction soustraction en binaire
    if checkneg(a,b) == True:                            #Si la fonction de check pour les négatifs de a ou de b detecte un nombre négatif affiche vrai
        y="Erreur : Le résultat de l'opération est négatif" #y prend comme variable un texte de type string "Erreur : Le résultat de l'opération est négatif"
        return y                                          #Retourne y
    if checkneg2(a) == False or checkneg2(b) == False:     #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"   #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkoct(a) == False or checkoct(b) == False:     #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y                        
    a,b=oct2dec(str(a)),oct2dec(str(b))                  #Transforme a et b en nombre binaires
    a,b=eval(a),eval(b)                                  #a et b se transforment en type nombre
    c=dec2oct(str(a-b))                                  # c prend la valeur de a-b puis on le transforme en string pour pouvoir passer de c en décimal a c en binaire
    return c                                             #Retourne c

def multiplicationoct(a,b):          #Définit la fonction multiplication en binaire
    if checkneg2(a) == False or checkneg2(b) == False:   #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkoct(a) == False or checkoct(b) == False:     #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    a,b=oct2dec(a),oct2dec(b)                            #a et b se transforment en nombre décimaux
    a,b=eval(a),eval(b)                                  #a et b passent du type string au type nombre
    c=dec2oct(str(a*b))                                  #c prend la valeur de a*b puis passe en type string pour etre convertit de décimal à binaire
    return c                                             #affiche c (en binaire)

def divisionoct(a,b):                #Définit la fonction division en binaire
    if checkneg2(a) == False or checkneg2(b) == False:    #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkoct(a) == False or checkoct(b) == False:      #Si la fonction de check pour les nombres binaire détecte un nombre qui n'est pas binaire
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    a,b=oct2dec(a),oct2dec(b)                             #a et b se transforment de décimaux à binaires
    a,b=eval(a),eval(b)                                   #a et b passent du type string au type nombre
    if b==0:                                              #Dans le cas ou b serait égal à 0
        return 'Erreur : Division par 0'                  #Retourner 'Erreur : Division par 0'  
    else:                                                 #Sinon 
        c,d=dec2oct(str(a//b)),dec2oct(str(a%b))          #c prend la valeur de la division euclidienne de a par b le tout transformé en binaire et d prend la valeur du reste de la division euclidienne , transformé en binaire
    return c,'Reste de ',d                                #Affiche c puis d

def racineoct(a):                   #Définit la fonction racine en binaire
    if checkneg2(a) == False:                             #Si la fonction de check2 pour le négatif a detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    if checkoct(a) == False:                              #Si la fonction de check pour le nombre binaire détecte un nombre qui n'est pas binaire                              
        y="Erreur : Vous avez fait une erreur de syntaxe" #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                          #Retourne y
    b=oct2dec(a)                                          #b prend la valeur de a et passe de binaire à décimal
    b=int(b)                                              #Transforme b en entier
    c=int(sqrt(int(b)))                                   #C prend la valeur de la racine de l'entier b
    if c**2==b:                                           #Si c au carré vaut b
        c=dec2oct(str(c))                                 #c prend la valeur du type string de c puis se transforme en nombre binaire
        return str(c)                                     #Retourne c qui est en type string
    else:                                                 #Sinon
        return "Erreur : La racine n'est pas un nombre entier" #Retourner "Erreur : La racine n'est pas un nombre entier"

def carreoct(a):                   #Définit la fonction carré en binaire
    if checkneg2(a) == False:                              #Si la fonction de check2 pour le négatif a detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    if checkoct(a) == False:                               #Si la fonction de check pour le nombre binaire détecte un nombre qui n'est pas binaire     
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                            #Retourne y
    a=oct2dec(a)                                           #a prend la valeur de a mais en decimal
    c=int(a)                                               #c prend la valeur de a en entier
    c=dec2oct(str(c**2))                                   #c prend la valeur de c puissance deux transformé en type string dans le but de pouvoir le transformer de decimal à binaire
    return c                                               #Retourne la valeur c

def puissanceoct(a,n):             #Définit la fonction puissance en binaire
    if checkneg2(a) == False or checkneg2(n) == False:     #Si la fonction de check2 pour les négatifs de a ou de b detecte un nombre négatif
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    if checkoct(a) == False:                               #Si la fonction de check pour le nombre binaire a détecte un nombre qui n'est pas binaire     
        y="Erreur : Vous avez fait une erreur de syntaxe"  #y prend comme variable un texte de type string "Erreur : Vous avez fait une erreur de syntaxe"
        return y                                           #Retourne y
    a,n=int(oct2dec(a)),int(oct2dec(n))                    #a prend la valeur décimale de a (type entier) et n prend la valeur de l'entier décimal de n
    if checkpuissanceoct(a,n) == False:                    #Utilise la puissance de check de a et n pour voir si ils ne sont pas trop grands
        y="Erreur : L'une des deux valeurs est trop grande" #y prend la valeur "Erreur : L'une des deux valeurs est trop grande"
        return y                                           #Retourne y
    c=dec2oct(str(a**n))                                   #c prend la valeur de a puissance n transformé en decimal
    return c                                               #Affiche c

#Début des fonctions binaires

def bin2dec(x):                     
    if checkbin(x) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    else:            
        x=str(int(x))
        s=0
        for i in x:                    
            s=s*2+int(i)
        return str(s)
        
def bin2hex(x):
    if checkbin(x) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    else:
        y=dec2hex(bin2dec(x))
        return str(y)

def dec2bin(x):
    z = eval(x)
    y = ""
    if z == 0:
        y = '0'
    try:
        if z/int(z)==1:
            while z != 0:
                z, r = z//2, z%2
                y = str(r)+y
        else:
            y="Erreur : Vous avez entré un nombre à virgule"
        return y
    except ZeroDivisionError:
        y='0'
        return y

#Debut de l'hexadecimal

def hex2dec(x):
    y = int(x, 16)
    return str(y)

def hex2bin(x):
    y=dec2bin(hex2dec(x))
    return str(y)

def dec2hex(x):
    z = eval(x)
    chiffre_hexa = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    y = ""
    if z == 0:
        y = '0'
    while z != 0:
        z, r = z//16, z%16
        y = chiffre_hexa[r]+y
    return str(y)
#Fin des conversion hexa

#Début fonctions octal

def oct2dec(x):
    if checkoct(x) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    else:            
        x=str(int(x))
        s=0
        for i in x:                    
            s=s*8+int(i)
        return str(s)

def dec2oct(x):
    z = int(str(x))
    y = ""
    if z == 0:
        y = '0'
    try:
        if z/int(z)==1:
            while z != 0:
                z, r = z//8, z%8
                y = str(r)+y
        else:
            y="Erreur : Vous avez entré un nombre à virgule"
        return y
    except ZeroDivisionError:
        y='0'
        return y

def bin2oct(x):
    if checkbin(x) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    else:
        y=dec2oct(bin2dec(x))
        return str(y)

def oct2bin(x):
    if checkoct(x) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    else:
        y=dec2bin(oct2dec(x))
        return str(y)

def oct2hex(x):
    if checkoct(x) == False:
        y="Erreur : Vous avez fait une erreur de syntaxe"
        return y
    else:
        y=dec2hex(oct2dec(x))
        return str(y)

def hex2oct(x):
    y=dec2oct(hex2dec(x))
    return str(y)

#Fonctions de check

def checkoct(x):
    for i in str(x):
        if i == "8" or i == "9":
            return False
    return True

def checkneg(a,b):
    a,b=eval(a),eval(b)
    if b>a:
        return True
    return False

def checkneg2(x):
    try:
        if x[0] == '-':
            return False
    except IndexError:
        return False
    return True

def checkbin(x):
    for i in x:
        if i != "0" and i != "1":
            return False
    return True

def checkresult(x):
    if len(str(x)) > 20:
        return False
    return True

def checkpuissance(x,y):
    if len(str(x)) > 4 or len(str(y)) > 3:
        return False
    return True

def checkpuissancehex(x,y):
    if len(str(x)) > 3 or len(str(y)) > 2:
        return False
    return True

def checkpuissancebin(x,y):
    if len(str(x)) > 13 or len(str(y)) > 10:
        return False
    return True

def checkpuissanceoct(x,y):
    if len(str(x)) > 5 or len(str(y)) > 4:
        return False
    return True

#Fin des fonctions de check

Conclusion :


Pour télécharger l'exécutable du programme :
  • lien en cours de création*


Pour nous contacter : calculmage@gmail.com

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Merci pour le partage
je viens de lire le code et de le tester, il génial !! Grace a vous je vais pouvoirs comprendre plusieurs chose (je débute)
Bonjour,

S'il vous j'ai besoin d'aide, je cherche un code pl/sql qui permet de traduire les chiffres en lettres.

Merci!!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.