enigma_gui.py

# ===================================================================
# Create an enigma machine simple GUI
# ===================================================================

import PySimpleGUI as sg
import sys

def enigma_gui(config):

    #font2     = ('Aerial',12)
    #font4     = ('Aerial',14)
    font2      = ('Courier New',14)
    font4      = ('Courier New',16)

    rotors     = list(config.rotors.keys())
    abc        = config.abc
    abclen     = config.abclen
    tsize      = 64              # GUI text field size

    # ---- GUI rotors -----------------------------------------------

    names  = config.default_rotor_names
    starts = config.default_rotor_starts

    rotor1 = [ [sg.Combo(rotors,
                         default_value=names[2],
                         font=font4,key='-RROTOR-'),
                sg.Combo(abc,
                         default_value=abc[starts[2]],
                         font=font4,key='-RPOSITION-',size=(2,1))]]
    rotor2 = [ [sg.Combo(rotors,
                         default_value=names[1],
                         font=font4,key='-MROTOR-'),
                sg.Combo(abc,
                         default_value=abc[starts[1]],
                         font=font4,key='-MPOSITION-',size=(2,1))]]
    rotor3 = [ [sg.Combo(rotors,
                         default_value=names[0],
                         font=font4,key='-LROTOR-'),
                sg.Combo(abc,
                         default_value=abc[starts[0]],
                         font=font4,key='-LPOSITION-',size=(2,1))]]

    # ---- big alphabet (many characters) ---------------------------

    alphabet0 = [ 'A','B','C','D','E','F','G','H','I','J','K','L',
                  'M','N','O','P','Q','R','S','T','U','V','W','X',
                  'Y','Z','1','2','3','4','5','6','7','8','9','0',
                  '.','=','+','-','/','*','(',')' ]
    layout0   = [ [sg.Button('1',font=font4),
                   sg.Button('2',font=font4),
                   sg.Button('3',font=font4),
                   sg.Button('4',font=font4),
                   sg.Button('5',font=font4),
                   sg.Button('6',font=font4),
                   sg.Button('7',font=font4),
                   sg.Button('8',font=font4),
                   sg.Button('9',font=font4),
                   sg.Button('0',font=font4)],

                  [sg.Button('Q',font=font4),
                   sg.Button('W',font=font4),
                   sg.Button('E',font=font4),
                   sg.Button('R',font=font4),
                   sg.Button('T',font=font4),
                   sg.Button('Y',font=font4),
                   sg.Button('U',font=font4),
                   sg.Button('I',font=font4),
                   sg.Button('O',font=font4),
                   sg.Button('P',font=font4)],

                  [sg.Button('A',font=font4),
                   sg.Button('S',font=font4),
                   sg.Button('D',font=font4),
                   sg.Button('F',font=font4),
                   sg.Button('G',font=font4),
                   sg.Button('H',font=font4),
                   sg.Button('J',font=font4),
                   sg.Button('K',font=font4),
                   sg.Button('L',font=font4)],

                  [sg.Button('Z',font=font4),
                   sg.Button('X',font=font4),
                   sg.Button('C',font=font4),
                   sg.Button('V',font=font4),
                   sg.Button('B',font=font4),
                   sg.Button('N',font=font4),
                   sg.Button('M',font=font4),
                   sg.Button('.',font=font4),
                   sg.Button('M',font=font4)],

                  [sg.Button('=',font=font4),
                   sg.Button('+',font=font4),
                   sg.Button('-',font=font4),
                   sg.Button('*',font=font4),
                   sg.Button('(',font=font4),
                   sg.Button(')',font=font4)] ]

    # ---- enigma alphabet (26 characters) --------------------------
    # ---- special key layout for enigma alphabet

    alphabet1 = [ 'A','B','C','D','E','F','G','H','I','J','K','L','M',
                  'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' ]
    layout1   = [ [sg.Button('Q',font=font4),
                   sg.Button('W',font=font4),
                   sg.Button('E',font=font4),
                   sg.Button('R',font=font4),
                   sg.Button('T',font=font4),
                   sg.Button('Y',font=font4),
                   sg.Button('U',font=font4),
                   sg.Button('I',font=font4),
                   sg.Button('O',font=font4),
                   sg.Button('P',font=font4)],

                  [sg.Button('A',font=font4),
                   sg.Button('S',font=font4),
                   sg.Button('D',font=font4),
                   sg.Button('F',font=font4),
                   sg.Button('G',font=font4),
                   sg.Button('H',font=font4),
                   sg.Button('J',font=font4),
                   sg.Button('K',font=font4),
                   sg.Button('L',font=font4)],

                  [sg.Button('Z',font=font4),
                   sg.Button('X',font=font4),
                   sg.Button('C',font=font4),
                   sg.Button('V',font=font4),
                   sg.Button('B',font=font4),
                   sg.Button('N',font=font4),
                   sg.Button('M',font=font4)] ]

    # ---- test alphabet --------------------------------------------

    alphabet2 = [ 'A','B','C','D','E','F' ]
    layout2   = [ [sg.Button('A',font=font4),
                   sg.Button('B',font=font4),
                   sg.Button('C',font=font4),
                   sg.Button('D',font=font4),
                   sg.Button('E',font=font4),
                   sg.Button('F',font=font4)] ]

    # ---- layout without alphabet ----------------------------------

    layoutx = [ [sg.Text(font=font4,text_color='black',key='-IN-',
                         background_color='white',size=(tsize,1))],
                [sg.Text(font=font4,text_color='black',key='-OUT-',
                         background_color='white',size=(tsize,1))],

                [sg.Button('Exit',font=font4),
                 sg.Button('Clear Buffer',font=font4),
                 sg.Button('Reset Rotors',font=font4),
                 sg.Button('Set Rotors',font=font4)],

                [sg.Frame('Left Rotor',rotor3,title_location='n',
                       border_width=2,key='-ROTOR3-'),
                 sg.Frame('Middle Rotor',rotor2,title_location='n',
                          border_width=2,key='-ROTOR2-'),
                  sg.Frame('Right Rotor',rotor1,title_location='n',
                           border_width=2,key='-ROTOR1-')],

                [sg.Button('Stats',font=font4),
                 sg.Button('Display',font=font4)],

                [sg.Button('Auto Advance On',font=font4),
                 sg.Button('Auto Advance Off',font=font4),
                 sg.Button('Sub Debug On',font=font4),
                 sg.Button('Sub Debug Off',font=font4)],

                [sg.Text(config.configfile,font=font2)] ]

    # ---- return a GUI window --------------------------------------

    if abclen == 44:                   # big alphabet
        layout = layout0 + layoutx
    elif abclen == 26:                 # enigma alphabet
        layout = layout1 + layoutx
    elif abclen == 6:                  # test apphabet
        layout = layout2 + layoutx
    else:
        print()
        print('internal error - ' +
              'alaphabet size and GUI layout mismatch - ' +
              'end program')
        print()
        sys.exit()

    win = sg.Window('Enigma Machine',layout,
                    element_justification='c')

    return (win,tsize)