test_enigma_gui.py

#!/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()