Python :: Exercice sur une fonction

Fermé
Sayu - 4 déc. 2009 à 17:59
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 4 déc. 2009 à 22:50
Bonjour,
Je suis en train de faire un tuto python, mais je ne comprends pas quelques ligne d'un code donné (sur lequel je dois faire des exos). Je cite :
# -*- coding:Latin-1 -*-

class Application:
    def __init__(self):
        """Constructeur de la fenètre principale"""
        self.root =Tk()
        self.root.title('Code des couleurs')
        self.dessineResistance()
        Label(self.root,
              text ="Entrez la valeur de la résistance, en ohms :").grid(row =2)
        Button(self.root, text ='Montrer',
               command =self.changeCouleurs).grid(row =3, sticky = W) 
        Button(self.root, text ='Quitter',
               command =self.root.quit).grid(row =3, sticky = E)
        self.entree = Entry(self.root, width =14)
        self.entree.grid(row =3)
        # Code des couleurs pour les valeurs de zéro à neuf :
        self.cc = ['black','brown','red','orange','yellow',
                   'green','blue','purple','grey','white']
        self.root.mainloop()
      

    def dessineResistance(self): ############################ [text de Sayu] Je ne comprends pas cette fonction
        """Canevas avec un modèle de résistance à trois lignes colorées"""
        self.can = Canvas(self.root, width=250, height =100, bg ='ivory')
        self.can.grid(row =1, pady =5, padx =5)
        self.can.create_line(10, 50, 240, 50, width =5)         # fils
        self.can.create_rectangle(65, 30, 185, 70, fill ='light grey', width =2)
        # Dessin des trois lignes colorèes (noires au départ) :
        self.ligne =[]              # on mémorisera les trois lignes dans 1 liste  
        for x in range(85,150,35):
            self.ligne.append(self.can.create_rectangle(x,30,x+12,70,
                                                        fill='black',width=0))
    def changeCouleurs(self):
        """Affichage des couleurs correspondant à la valeur entrée"""
        self.v1ch = self.entree.get()       # la méthode get() 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]])
            
    def signaleErreur(self):
        self.entree.configure(bg ='red')            # colorer le fond du champ
        self.root.after(1000, self.videEntree)        # aprés 1 seconde, effacer
        
    def videEntree(self):
        self.entree.configure(bg ='white')            # rétablir le fond blanc
        self.entree.delete(0, len(self.v1ch))        # enlever les car. présents

# Programme principal :        
from Tkinter import *
from math import log10                # logarithmes en base 10
f = Application()                    # instanciation de l'objet application



Dans mon exo, ils me demandent de doubler la taille de la fenetre. C'est la que je me suis rendu compte que je ne comprenais pas ces lignes :

        self.ligne =[]              # on mémorisera les trois lignes dans 1 liste  
        for x in range(85,150,35):
            self.ligne.append(self.can.create_rectangle(x,30,x+12,70,
                                                        fill='black',width=0))


Pourquoi avoir fais un for ? Et pourquoi quand je supprime une valeur, ça fais un truc strange ? =/
J'ai taffé la dessus environ 3 heures, et j'ai pas saisi =/

Si vous voulez plus d'info n'hesitez pas à me le dire !

Merci à ceux qui veulent bien m'aider ^^

Cordialement,
Sayu

1 réponse

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
4 déc. 2009 à 22:50
Bonsoir,

J’ai l’impression qu’il s’agit d’un exercice de création d’un rectangle représentant une résistance électrique avec trois bandes de couleurs constituant le code couleur pour la valeur de la résistance.



La taille de la fenêtre , ce doit être réglé par
self.can = Canvas(self.root, width=250, height =100, bg ='ivory')



Quant aux lignes que tu ne comprends pas, je pense qu’un rectangle suffit à être défini par deux points de ses angles opposés.
Ainsi x,30,x+12,70 doivent être les coordonnées des deux point d’un rectangle:
(x,30) un point
et (x+12,70) le second point
Ce rectangle est paramétrisé en x: en changeant la valeur de x on obtient des rectanles positionnées différemment.

Il y a deux bandes couleurs rectangulaires:
85,30,97,70
120,70,132,70

Pour créer ces bandes, for x in range(85,150,35): donne successivement des valeus à x.

Cependant il y a un problème car range(85,150,35) est une liste d’entier définie ainsi:
le premier entier est 85, puis les entiers suivants sont obtenus par ajout du pas 35 successivment, les entiers retenus étant ceux inférieurs à 150,

Exemple range(2,26,3) est (2,5,8,11,14,17,20,23). L’entier 26 est exclu car c’est la limite indiquée dans range(2,26,3)


Et à mon avis , il n’y a pas que deux bandes de couleurs sur une résistance.
Il faut modifier la valeur 155 car le range(85,155,35) est [85,120] 155 ne peut pas y être car<150



Note que je ne connais pas le module Tk

J'ai aussi l'impression qu'il n'y a pas beaucoup de pratiquants de Python sur ccm
0