# =================================================================== # 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)