solution_027.py

#!/usr/bin/python3
# ===================================================================
# Calculate and display a resistor's value
# ===================================================================
# This code uses the PySimpleGUI module. It is also currently
# incomplete. The following needs to be added:
# c. Error messages when appropriate.
# d. How to handle resistors with 3,4,5, or 6 bands?
#    Perhaps display a diagram? Let the user choose how many bands?
#    Only handle 3 bands, tolerance, and multiplier resisters?
# ===================================================================

import PySimpleGUI as sg

band1_colors      = [ 'None','Brown','Red','Orange','Yellow','Green',
                      'Blue','Violet','Grey','White' ]
band2_colors      = [ 'None','Black','Brown','Red','Orange','Yellow',
                      'Green','Blue','Violet','Grey','White' ]
band3_colors      = [ 'None','Black','Brown','Red','Orange','Yellow',
                      'Green','Blue','Violet','Grey','White' ]
multiplier_colors = [ 'None','Brown','Red','Orange','Yellow','Green',
                      'Blue','Violet','Grey','White','Gold','Silver' ]
tolerance_colors  = [ 'None','Brown','Red','Green','Blue','Violet',
                      'Grey','Gold','Silver' ]
color_values      = { 'None':0,'Black':0,'Brown':1,'Red':2,'Orange':3,
                      'Yellow':4,'Green':5,'Blue':6,'Violet':7,
                      'Grey':8,'White':9 }
multiplier        = { 'None':1,'Black':1,'Brown':10,'Red':100,
                      'Orange':1000,'Yellow':10000,'Green':100000,
                      'Blue':1000000,'Violet':10000000,
                      'Grey':100000000,'White':1000000000,
                      'Gold':0.1,'Silver':0.01 }
tolerance         = { 'None':'unk','Brown':'+/1 1%','Red':'+/- 2%',
                      'Green':'+/- 0.5%','Blue':'+/- 0.25%',
                      'Violet':'+/- 0.1%','Grey':'+/- 0.05%',
                      'Gold':'+/- 5%','Silver':'+/- 10%' }

font1 = ('Arial',14)
font2 = ('Aerial',12)

layout = [ [sg.Text('1st Band',font=font2),
            sg.Text('2dn Band',font=font2),
            sg.Text('3rd Band',font=font2),
            sg.Text('Multiplier',font=font2),
            sg.Text('Tolerance',font=font2)],
          
           [sg.Combo(band1_colors,default_value='None',
            font=font1,key='band1'),
            sg.Combo(band2_colors,default_value='None',
            font=font1,key='band2'),
            sg.Combo(band3_colors,default_value='None',
            font=font1,key='band3'),
            sg.Combo(multiplier_colors,default_value='None',
            font=font1,key='multi'),
            sg.Combo(tolerance_colors,default_value='None',
            font=font1,key='toler')],

           [sg.Button('Exit',font=font2),
            sg.Button('Calculate',font=font2),
            sg.Button('Reset',font=font2)],

           [sg.Text(text_color='blue',background_color='Yellow',
            size=(80,8),font=font1,key='-MSG-')]]

# -------------------------------------------------------------------
# ---- calculate resistor's value
# -------------------------------------------------------------------

def calculate(values):

    # ---- get resistor values

    b1 = values['band1']
    b2 = values['band2']
    b3 = values['band3']
    mu = values['multi']
    to = values['toler']

    # ---- test for valid resistor values

    val = color_values[b1]
    val = val * 10 + color_values[b2]
    val = val * 10 + color_values[b3]

    val = val * multiplier[mu]

    return (val,tolerance[to])

# -------------------------------------------------------------------
# ---- main
# -------------------------------------------------------------------

# ---- Create the window
win = sg.Window("Resistor Value",layout)

# ---- Create an event loop
while True:

    event, values = win.read()

    # ---- exit program

    if event == "Exit" or event == sg.WIN_CLOSED:
        break

    # ---- reset

    if event == "Reset":
        win['band1'].update('None')
        win['band2'].update('None')
        win['band3'].update('None')
        win['multi'].update('None')
        win['toler'].update('None')
        win['-MSG-'].update('')
        continue

    # ---- calculate and display resistor's value

    if event == "Calculate":
        (val,tol) = calculate(values)
        win['-MSG-'].update(f'{val}\u03A9   {tol}')

win.close()