Retour


Code des couleurs


Cette application est inspiré d'un exercice de la page 211 du livre de Gérard Swinnen intitulé 'Apprendre à programmer avec Python 3'


Cette petite application a pour objectif d’apprendre à créer des dessins dans une fenêtre.

Notre projet est de créer une application qui permettra de déterminer la couleur des anneaux peints sur les résistances d'après une valeur souhaitée.

Les résistances sont des composants électroniques se présentant concrètement sous la forme de petites pièces tubulaires cerclées de bandes de couleur (en général 4 mais nous nous intéresserons ici que des 3 premières).

Ces bandes de couleur indiquent la valeur

numérique de la résistance, en fonction du code suivant :

Chaque couleur correspond conventionnellement à l’un des chiffres de zéro à neuf :

Noir = 0 ; Brun = 1 ; Rouge = 2 ; Orange = 3 ; Jaune = 4 ; Vert = 5 ; Bleu = 6 ; Violet = 7 ; Gris = 8 ; Blanc = 9.

On oriente la résistance de manière telle que les bandes colorées soient placées à gauche. La valeur de la résistance – exprimée en ohms (Ω) – s’obtient en lisant ces bandes colorées également à partir de la gauche : les deux premières bandes indiquent les deux premiers chiffres de la valeur numérique ; il faut ensuite accoler à ces deux chiffres un nombre de zéros égal à l’indication fournie par la troisième bande.

Exemple concret : supposons qu’à partir de la gauche, les bandes colorées soient maron, noir et rouge.

La valeur de cette résistance est 10000 Ω, ou 10 kΩ, ou encore 0,1 MΩ .


L'application aura cette apparence :

Le comportement que nous souhaitons avoir est le suivant :

  • on saisit la valeur de la résistance dans le widget texte modifiable, ici 42000 en ohm

  • en cliquant sur le bouton Montrer, les anneaux du dessin de la résistance indiquent les couleurs correspondantes.

  • On rajoute un bouton Effacer pour supprimer la valeur de la résistance (ici 42000) et mettre les 3 anneaux en couleur gris claire, vide.

  • Une ligne a été rajouté pour connaître les 3 chiffres correspondants aux 3 couleurs (pour les testes ou simplement pédagogique)


Voici les étapes à suivre :

1) Créer une fenêtre vide que l'on appelle aussi un cadre :

(voir dans 'ma première application' comment créer une fenêtre)


2) Ajouter un sizer

un flexGridSizer plus flexible que les autres.


3) Ajouter les 6 widgets, modifier leurs propriétés et ajouter 3 événements

un panneau (wx.panel) pour dessiner la résistance
- ajouter l'événement EV_PAINT

un texte fixe (wx.staticText) marquer "Entrer la valeur de la résistance, en ohms :",

un bouton (wx.buton) marquer Monter pour modifier le dessin,
- ajouter l'événement EV_BUTON

un texte modifiable (wx.CtrlText) pour que l'utilisateur puisse saisir la valeur de la résistance,

un bouton (wx.buton) marquer Effacer pour modifier le dessin et retirer la valeur de la résistance saisie,
- ajouter l'événement EV_BUTON

un texte fixe (wx.staticText) qui indiquera le nombre correspondant au 3 anneaux de la résistance.


4) Modifier le code source des événements

- pour l'événement qui permet de dessiner

def OnPanel1Paint(self, event):

      self.dc=wx.PaintDC(self.panel1)

      self.dc.DrawCircle(20,20,10)


pour créer la résistance :


def OnPanel1Paint(self, event):

dc = wx.PaintDC(self.panel1)

dc.Clear()

dc.SetPen(wx.Pen(wx.BLACK, 6))

dc.DrawLine(10, 70, 330, 70)

dc.SetPen(wx.Pen(wx.BLACK, 3))

dc.SetBrush(wx.LIGHT_GREY_BRUSH)

dc.DrawRectangle(85, 40, 170, 60)

self.TabColor=['black', 'black', 'black']

DrawRing(TabColor)


pour dessiner les 3 anneaux :


def DrawRing(TabVar):

dc.SetPen(wx.TRANSPARENT_PEN)

      for n in range(3):

dc.SetBrush(wx.Brush(TabVar[n]))

dc.DrawRectangle(85, 40, 170, 60)


pour déterminer les 3 couleurs :

def DrawRing(self):

self.cc = ['black','brown','red','orange','yellow','green','blue','purple','grey','white']




# les fils ou pattes du composant :

self.can.create_line(10, 50, 240, 50, width =5)

# le rectangle gris représentant le cylindre de la résistance

self.can.create_rectangle(65, 30, 185, 70, fill ='light grey', width =2)

# le dessin des trois lignes colorées (noires au départ) :

# Code des couleurs pour les valeurs de zéro à neuf :

self.cc = ['black','brown','red','orange','yellow','green','blue','purple','grey','white']

# on mémorise les trois lignes dans 1 liste :

self.ligne =[]

for x in range(85,150,24):

      self.ligne.append(self.can.create_rectangle(x,30,x+12,70,fill='black',width=0))


pour changer les 3 lignes :


def changeCouleurs(self):

"""Affichage des couleurs correspondant à la valeur entrée"""

self.v1ch = self.entree.get()

# cette méthode renvoie une chaîne

try:

v = float(self.v1ch)

# conversion en valeur numérique

except:

err =1

# erreur : entrée non numérique

else:

err =0

if err ==1 or v < 10 or v > 1e11 :

self.signaleErreur()

# entrée incorrecte ou hors limites

else:

li =[0]*3

# liste des 3 codes à afficher

logv = int(log10(v))

# partie entière du logarithme

ordgr = 10**logv

# ordre de grandeur

# extraction du premier chiffre significatif :

li[0] = int(v/ordgr)

# partie entière

decim = v/ordgr - li[0]

# partie décimale

# extraction du second chiffre significatif :

li[1] = int(decim*10 +.5)

# +.5 pour arrondir correctement

# nombre de zéros à accoler aux 2 chiffres significatifs :

li[2] = logv -1

# Coloration des 3 lignes :

for n in range(3):

self.can.itemconfigure(self.ligne[n], fill =self.cc[li[n]])


pour voir le fichier source Codecouleurs.py


pour avoir toutes les possibilités de wxPaint, voir la page wxDC dans l'aide de wxPython en anglais.

- pour l'événement qui permet au bouton Montrer de dessiner les anneaux de couleurs

- pour l'événement qui permet au bouton Effacer de dessiner des anneaux de couleur noir et supprimer le texte de la valeurs de la résistance


Pour dessiner dans un Panel il faut utiliser PaintDC, et l'évènement EVT_PAINT, qui est appelé à chaque fois que le panel est rafraîchit.
On peut rajouter des SpinCtrl (poignée de redimensionnement) permettant de modifier le cercle.