Calcul de résistances

Soyez le premier à donner votre avis sur cette source.

Vue 13 286 fois - Téléchargée 957 fois

Description

Permet de trouver la valeur d'une résistance à partir du code couleur et vice versa:
-Le code couleur est entré par des listboxs et la valeur s'affiche dans le champ de saisie.
-La valeur est entrée dans un champ de saisie et les couleurs sont actualisées.

Source / Exemple :


# -*- coding: cp1252 -*-
#Calcul de résistances
#Ecrit et développé par Amaury

from Tkinter import *
from math import log

cent,dix,unit,multip,tolere=0,0,0,1,0

# Dictionnaires de décodage: associent leurs valeurs aux couleurs.
chiffres={"#d18220":0,"black":0,"brown":1,"red":2,"orange":3,"yellow":4,"green":5,"blue":6,"purple":7,"grey":8,"white":9}
multiplicateur={"#8f966f":0.01,"gold":0.1,"black":1,"brown":10,"red":10**2,"orange":10**3,"yellow":10**4,"green":10**5,"blue":10**6,"purple":10**7,"grey":10**8,"white":10**9}
tolerence={"#8f966f":0.1,"gold":0.05,"brown":0.01,"red":0.02,"green":0.005,"blue":0.0025,"purple":0.001}

# Dictionnaires de codage: associent leurs couleurs aux valeurs.
couleurs={-2:"#8f966f",-1:"gold",0:"black",1:"brown",2:"red",3:"orange",4:"yellow",5:"green",6:"blue",7:"purple",8:"grey",9:"white"}
couleurs2={-2:"#8f966f",-1:"gold",0:"#d18220",1:"brown",2:"red",3:"orange",4:"yellow",5:"green",6:"blue",7:"purple",8:"grey",9:"white"}

# Listes des couleurs à insérer dans les Listbox.
coul=["noir","marron","rouge","orange","jaune","vert","bleu","violet","gris","blanc"]
mult=["argent","or","noir","marron","rouge","orange","jaune","vert","bleu","violet"]
tole=["argent","or","marron","rouge","vert","bleu","violet"]

# Correspondances entre le texte affiché dans les Listbox et les couleurs affichées.
traduction={"argent":"#8f966f","or":"gold","aucun":"#d18220","noir":"black","marron":"brown","rouge":"red","orange":"orange","jaune":"yellow","vert":"green","bleu":"blue","violet":"purple","gris":"grey","blanc":"white"}
    
def Select(liste):
    #Acquiert la valeur choisie par l'utilisateur dans une Listbox.

    choix=traduction[str(liste.get(liste.curselection()))]
    return choix

# Ces 5 fonctions appellent sur évènement la fonction Select() avec pour argument le nom de la liste où l'évènement à eut lieu.
def Select1 (e):
    global res, cent
    coul=Select(val1)
    res.create_rectangle (120,11,140,89,fill= coul,outline= coul)
    cent=chiffres[coul]*100
    Decode()

def Select2 (e):
    global res, dix
    coul=Select(val2)
    res.create_rectangle (150,11,170,89,fill= coul,outline= coul)
    dix=chiffres[coul]*10
    Decode()

def Select3 (e):
    global res, unit
    coul=Select(val3)
    res.create_rectangle (180,11,200,89,fill= coul,outline= coul)
    unit=chiffres[coul]
    Decode()

def Select4 (e):
    global res, multip
    coul=Select(val4)
    res.create_rectangle (210,11,230,89,fill= coul,outline= coul)
    multip=multiplicateur[coul]
    Decode()

def Select5 (e):
    global res, tolere
    coul=Select(val5)
    res.create_rectangle (360,11,380,89,fill= coul,outline= coul)
    tolere=tolerence[coul]
    Decode() 

def Draw ():
    # Dessine une résistance vierge dans le Canevas.

    global res,valeur

    res.create_line (20,50,100,50,width=5)
    res.create_line (480,50,400,50,width=5)
    res.create_rectangle (100,10,400,90,fill="#d18220",outline="black")
    valeur.insert(0,"Entrer une valeur ou indiquer le code couleur de la résistance")

def Decode():
    #Décode la valeur d'une résistance à partir du code couleur. Cette fonction n'effectue que le calcul et l'affichage.
    
    global valeur, cent, dix, unit, multip, tolere
    resistance=float((cent+dix+unit)*multip)

    valeur.delete(0,END)
    ecart=tolere*resistance
    
    if tolere==0:
        valeur.insert(0,SI(resistance,"code") + " Ohms" )

    else:
        valeur.insert(0,"(" + SI(resistance,"code") + "  +/-  " + SI(ecart,"code") + ") " + "Ohms")
    valeur.bind("<Button-1>",Del)

def Code (e):
    # Cette fonction code une résistance à partir d'une valeur entrée par l'utilisateur.
    
    global res,valeur,couleurs,couleurs2, typ, val1, val2, val3, val4

    chaine=valeur.get()                     #Acqusition de la valeur.
    try:
        tab=chaine.split(" ")               #Isolement de la valeur numérique et du multiple SI (k,M,G,m,µ,n).
    except:
        tab=[chaine]
        
    nombre=int(SI(tab,"decode"))            #Convertit le tableau contenant la valeur et le multiple en une valeur numérique.

    taille=0

    tip=typ.get()                           #Choisit le type de décodage : Standard à 3 anneaux ou Précision à 4 anneaux.

    if (tip==2):                            #Récupère chaque composantes du nombre : unités, dizaine, centaines (si précision), ainsi que le multiplicateur.
        
        while (nombre>999):
            nombre=nombre/10
            taille=taille+1

        cent=nombre/100
        nombre=nombre-cent*100
        dix=nombre/10
        nombre=nombre-dix*10
        val1.select_set(cent)               #Envoie aux Listbox la couleur correspondant au chiffre obtenue
        Select1(e)                          #Fait lire au programme la valeur précédement envoyée aux Listbaox.
                                            #Cette pirouette est nécessaire pour pouvoir ensuite tolérencer la résistance choisie.

    elif (tip==1):
        
        while (nombre>99):
            nombre=nombre/10
            taille=taille+1

        res.create_rectangle (120,11,140,89,fill= "#d18220",outline= "#d18220")

        dix=int(nombre/10)
        nombre=nombre-dix*10
        
        
    val2.select_set(dix)
    Select2(e)
    val3.select_set(nombre)
    Select3(e)
    val4.select_set(taille+2)
    Select4(e)

def SI(nombre,sens):
    #Code ou décode un nombre au format SI: VALEUR+[Espace]+MULTIPLES
    
    if sens=="code":                        #Fonction de codage: récupère un nombre et retourne une chaine de caractères
        try:
            taille=log(nombre,10)
        except:
            pass

        nombre=float(nombre)

        #Affecte un pultiple en fonction de la taille du nombre        
        if (taille >=8.999999):
            chaine=str(nombre/(10**9))+" G"

        elif (taille >=5.999999):
            chaine=str(nombre/(10**6))+" M"

        elif (taille >=2.999999):
            chaine=str(nombre/(10**3))+" k"

        elif (taille <=-6.000001):
            chaine=str(nombre*(10**9))+" n"

        elif (taille <=-3.000001):
            chaine=str(nombre*(10**6))+" µ"

        elif (taille <=-0.000001):
            chaine=str(nombre*(10**3))+" m"

        else :
            chaine=str(nombre)+" "

        return chaine

    elif sens=="decode":                    #Fonction de décodage: récupère un tableau [VALEUR,multiple] et retourne une valeur numérique

        tab=nombre

        if len(tab)==1:
            valeur=float(tab[0])

        elif tab[1]=="k":
            valeur=float(tab[0])*(10**3)

        elif tab[1]=="M":
            valeur=float(tab[0])*(10**6)

        elif tab[1]=="G":
            valeur=float(tab[0])*(10**9)

        elif tab[1]=="m":
            valeur=float(tab[0])*(10**-3)

        elif tab[1]=="u":
            valeur=float(tab[0])*(10**-6)

        elif tab[1]=="n":
            valeur=float(tab[0])*(10**-9)

        return float(valeur)

def Del(e):
    #Efface le contenu de la zone de saisie si l'utilisateur clique dedans
    
    global valeur

    valeur.delete(0,END)
    valeur.bind("<Button-1>",Passer)        #Empèche la programme d'effacer la zone à chaque clic: permet de modifier la valeur entrée sans la voire s'effacer...

def Passer(e):
    pass                                    #No comment  ;)

########################## Interface Graphique ##########################

root=Tk()

res=Canvas(root,width=500,height=100,bg="ivory")
res.grid(row=0,column=0,columnspan=5)

txt1=Label(root,text="Centaines :")
txt2=Label(root,text="Dixaines :")
txt3=Label(root,text="Unités :")
txt4=Label(root,text="Multiplicateur :")
txt5=Label(root,text="Tolérence :")
txt6=Label(root,text="Résistance :")

txt1.grid(row=1,column=0)
txt2.grid(row=1,column=1)
txt3.grid(row=1,column=2)
txt4.grid(row=1,column=3)
txt5.grid(row=1,column=4)
txt6.grid(row=3,column=0)

val1=Listbox(root,height=10)
val2=Listbox(root,height=10)
val3=Listbox(root,height=10)
val4=Listbox(root,height=10)
val5=Listbox(root,height=10)

valeur=Entry(root,width=70)

valeur.grid(row=3,column=1,rowspan=2,columnspan=4)

valeur.bind("<Return>",Code)
valeur.bind("<Button-1>",Del)

for i in coul:
    val1.insert (END, i)
    val2.insert (END, i)
    val3.insert (END, i)

for i in mult:
    val4.insert (END, i)

for i in tole:
    val5.insert (END, i)

val1.bind('<Double-1>',Select1)
val2.bind('<Double-1>',Select2)
val3.bind('<Double-1>',Select3)
val4.bind('<Double-1>',Select4)
val5.bind('<Double-1>',Select5)

val1.grid(row=2,column=0)
val2.grid(row=2,column=1)
val3.grid(row=2,column=2)
val4.grid(row=2,column=3)
val5.grid(row=2,column=4)

typ=IntVar()

r1=Radiobutton(root,text="Standard",variable=typ,value=1)
r2=Radiobutton(root,text="Précision",variable=typ,value=2)

r1.grid(row=3,column=0)
r2.grid(row=4,column=0)

r1.select()
r2.deselect()

Draw()

Sign=Label(root,text="Ecrit et développé par Amaury")
Sign.grid(row=10, column=3,columnspan=2)

root.title("Code couleur des résistances")
root.resizable(False,False)
root.mainloop()

Conclusion :


Le code n'est pas bien compliqué: il met en œuvre les dictionnaires, les canvas et les listbox... Le reste est du calcul...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
24
Date d'inscription
vendredi 10 août 2007
Statut
Membre
Dernière intervention
10 mai 2009

Merci du compliment :).
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
17
Très sympa comme code, j'aime beaucoup, simple mais complet, bien codé, claire, fonctionnel une attention porté à l'interface graphique, pour moi, c'est la totale, poursuit l'écriture de tes sources dans ce sens, c'est à dire une interface soigné, un code claire, et surtout le contrôle (j'entends par la que l'utilisateur ne peut pas faire buger le programme en entrant une mauvaise donnée). Une source respectant ces 3 critères est forcément bonne d'un point de vu technique et vaut 10 pour moi.
Voila donc ton 10.

Ciao
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Source sympa, et le code est propre.

je te mets un 8/10

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.