#! /usr/bin/env python
# -*- coding: Utf-8 -*-

class Application:
    def __init__(self):
        """A foablak constructora"""
        self.root =Tk()
        self.root.title('Szinkódok')
        self.drawResistor()
        Label(self.root,
              text ="Írja be az ellenállásértéket ohm-ban :").grid(row =2)
        Button(self.root, text ='Mutat',
               command =self.changeColours).grid(row =3, sticky = W)
        Button(self.root, text ='Kilép',
               command =self.root.quit).grid(row =3, sticky = E)
        self.entry = Entry(self.root, width =14)
        self.entry.grid(row =3)
        # a 0-9 ertekek szinkodjai :
        self.cc = ['black','brown','red','orange','yellow',
                   'green','blue','purple','grey','white']
        self.root.mainloop()

    def drawResistor(self):
        """Vaszon ellenallas modellel, amin harom szines csik van"""
        self.can = Canvas(self.root, width=250, height =100, bg ='light blue')
        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 ='beige', width =2)
        # Harom szines csik (indulaskor feketek) :
        self.line =[]              # egy listaban fogjuk tarolni a harom csikot
        for x in range(85,150,24):
            self.line.append(self.can.create_rectangle(x,30,x+12,70,
                                                        fill='black',width=0))

    def changeColours(self):
        """A beirt erteknek megfelelo harom szin kiiratasa"""
        self.v1ch = self.entry.get()       # get() metodus egy stringet ad vissza
        try:
            v = float(self.v1ch)            # atalakitas szamertekke
        except:
            err =1                          # error : nem numerikus adat
        else:
            err =0
        if err ==1 or v < 10 or v > 1e11 :
            self.reportError()            # inkorrekt vagy tartomanyon kivuli ertek
        else:
            li =[0]*3                       # a 3 kiirando kod listaja
            logv = int(log10(v))            # logaritmus egesz resze
            ordgr = 10**logv                # nagysagrend
            # az elso szignifikans szamjegy eloallitasa :
            li[0] = int(v/ordgr)            # egesz resz
            decim = v/ordgr - li[0]         # tizedes resz
            # a masodik szignifikans szamjegy eloallitasa :
            li[1] = int(decim*10 +.5)       # +.5 a korrekt kerekiteshez
            # a 2 szignifikans szamjegyhez hozzateendo nullak szama :
            li[2] = logv -1
            # A 3 szakasz szinezese :
            for n in range(3):
                self.can.itemconfigure(self.line[n], fill =self.cc[li[n]])

    def reportError(self):
        self.entry.configure(bg ='red')		# mezo hatterenek szinezese
        self.root.after(1000, self.emptyEntry)		# 1 sec utan torolni

    def emptyEntry(self):
        self.entry.configure(bg ='white')		# feher hetter visszaallitasa
        self.entry.delete(0, len(self.v1ch))		# karakterek torlese

# Foprogram :
if __name__ == '__main__':
    from Tkinter import *
    from math import log10                  # 10 alapu logaritmus
    f = Application()                       # alkalmazas objektum letrehozas

 #dessineResistance -> drawResistor
 #changeCouleurs -> changeColours
 #entree-> entry
 #ligne -> line
 #videEntree -> emptyEntry
 #signaleErreur -> reportError