#!/usr/bin/python3
# ===================================================================
# test Enigma Machine simple GUI
# ===================================================================
from enigma_gui import enigma_gui
from EnigmaConfig import EnigmaConfig
from EnigmaMachine import EnigmaMachine
import PySimpleGUI as sg
import os
import re
import sys
# ---- configuration file
configfile = 'enigma_config.csv'
if len(sys.argv) > 1:
configfile = sys.argv[1]
if not os.path.exists(configfile):
print()
print(f'Can not find enigma configuration file ({configfile})')
print()
sys.exit()
# ---- create enigma machine simulation
em = EnigmaMachine(configfile)
# ---- create a GUI window
win,tsize = enigma_gui(em.config)
# ---- alphabet to index
def _char_to_idx(c,abc):
for i in range(len(abc)):
if abc[i] == c:
return i
return 0
# ---- event loop
x = ''
while(True):
event,values = win.read()
##print('-----------------------------------------')
##print(f'event={event}')
##print(values)
##print('-----------------------------------------')
# ---- keypress
if event in em.config.abc:
if len(x) < tsize:
x = x + event
win['-IN-'].update(x)
continue
# ---- exit program
if event in ('Exit',sg.WIN_CLOSED):
break
# ---- reset rotors
if event == 'Reset Rotors':
x = ''
win['-IN-'].update(x)
win['-OUT-'].update(x)
em.reset()
continue
# ---- set rotors
if event == 'Set Rotors':
win['-IN-'].update('')
win['-OUT-'].update('')
rnam = values['-RROTOR-']
rpos = values['-RPOSITION-']
ridx = _char_to_idx(rpos,em.abc)
mnam = values['-MROTOR-']
mpos = values['-MPOSITION-']
midx = _char_to_idx(mpos,em.abc)
lnam = values['-LROTOR-']
lpos = values['-LPOSITION-']
lidx = _char_to_idx(lpos,em.abc)
nam = [lnam,mnam,rnam]
pos = [lidx,midx,ridx]
print(f'names: {nam} starts: {pos}')
continue
# ---- encrypt/decrypt input data
if event == 'Encrypt/Decrypt':
continue
# ---- enigma machine display function
if event == 'Display':
em.display_internal_state()
continue
# ---- enigma machine display rotor stats
if event == 'Stats':
em.display_rotor_stats()
continue
win.close()
print()