Не переключается ротор в шифровальной машинке Энигма

Сейчас я пиши шифровальную машину Энигма. Но написав все я заметил что при переключении только первого ротора, он не меняет конечный результат.

from tkinter import *
from PIL import Image, ImageTk
import string


abc = list(string.ascii_uppercase)

# rotor 3
class thirdRotor:
    def __init__(self):
        self.dictionary = [(1,3),(5,20),(17,2),(2,15),(14,18),(8,1),(12,13),(18,10),(9,5),(13,24),(3,19),(23,6),(6,17),(16,12),(25,21),(15,26),(4,8),(10,25),(21,9),(26,14),(22,11),(19,16),(11,23),(24,7),(7,4),(20,22)]
        self.code_position = 0
        self.decode_position = 0

    def code(self, input, direction):
        self.code_position = self.code_position + 1
        if self.code_position > 26:
            self.code_position = self.code_position - 26
        search = self.cykleSearch((input + self.code_position))
        result = 0
        for i in range(0,26):
            if self.dictionary[i][switchDirection(direction)] == search:
                result = self.dictionary[i][direction]
        return result

    def cykleSearch(self, search):
        while search > 26:
            search = search - 26
        return search

class stator:
    def __init__(self):
        self.dictionary = [(5,24),(14,19),(9,23),(26,13),(22,7),(20,12),(17,1),(21,25),(16,2),(18,3),(11,8),(10,6),(4,15),(24,5),(19,14),(23,9),(13,26),(7,22),(12,20),(1,17),(25,21),(2,16),(3,18),(8,11),(6,10),(15,4)]

    def find(self, input):
        for i in range(0,26):
            if self.dictionary[i][0] == input:
                return self.dictionary[i][1]
# rotor 2
class secondRotor:
    def __init__(self):
        self.dictionary = [(18,8),(4,6),(13,5),(23,24),(12,25),(19,21),(2,14),(24,16),(3,19),(7,1),(10,23),(6,2),(20,13),(15,12),(14,10),(5,20),(17,3),(16,17),(9,22),(25,15),(11,18),(8,26),(1,7),(21,9),(22,11),(26,4)]
        self.code_position = 0

    def code(self, input, direction):
        self.code_position = self.code_position + 1
        real_position = self.code_position

        search = self.cykleSearch(input + self.cycleItterator(real_position))
        result = 0
        for i in range(0,26):
            if self.dictionary[i][switchDirection(direction)] == search:
                result = self.dictionary[i][direction]
        return result


    def cycleItterator(self, itterator):
        while itterator > 26:
            itterator = itterator // 26
        return itterator

    def cykleSearch(self, search):
        while search > 26:
            search = search - 26
        return search


# rotor 1
class firstRotor:
    def __init__(self):
        self.dictionary = [(24,19),(19,20),(5,13),(6,7),(2,5),(15,25),(8,17),(9,4),(20,10),(12,11),(25,23),(11,6),(18,8),(23,2),(21,16),(16,26),(26,1),(7,21),(3,3),(4,12),(14,15),(22,9),(17,24),(13,22),(1,14),(10,18)]


    def code(self, input, direction):
        self.code_position = self.code_position + 1
        real_position = self.code_position

        search = self.cykleSearch(input + self.cycleItteratorSqrt(real_position))
        result = 0
        for i in range(0,26):
            if self.dictionary[i][switchDirection(direction)] == search:
                result = self.dictionary[i][direction]
        return result

    def cycleItteratorSqrt(self, itterator):
        if itterator // (26*26) > 1:
            while itterator > (26*26):
                itterator = itterator // (26*26)
        else:
            itterator = itterator // (26*26)
        return itterator

    def cykleSearch(self, search):
        while search > 26:
            search = search - 26
        return search


rotor_3 = thirdRotor()
rotor_2 = secondRotor()
rotor_1 = firstRotor()
stator = stator()

def crypt_word(word):
    result = list()
    for letter in word:
        result.append(codeByRotors(letter))
    return result


def codeByRotors(letter):
    number = abc.index(letter) + 1
    thirdRtl = rotor_3.code(number, 0)
    secondRtl = rotor_2.code(thirdRtl, 0)
    firstRtl = rotor_1.code(secondRtl, 0)
    statorRtl = stator.find(firstRtl)
    firstLtr = rotor_1.code(statorRtl, 1)
    secondLtr = rotor_2.code(firstLtr, 1)
    thirdLtr = rotor_3.code(secondLtr, 1)
    result = thirdLtr

    return abc[result - 1]


def switchDirection(direction):
    return 0 if direction == 1 else 1

def configureMachine(frtRrStart, sndRrStart, trdRrStart):
    rotor_1.code_position = frtRrStart
    rotor_2.code_position = sndRrStart
    rotor_3.code_position = trdRrStart


def runMachine(stringByWords):
    result = ''
    strg = ''
    for word in stringByWords:
        crypted = crypt_word(word)
        result += strg.join(crypted)
        result += ' '
    return result


def process(frtRrStart, sndRrStart, trdRrStart, inputString):
    inputString = inputString.upper()
    stringByWords = inputString.split()
    configureMachine(int(frtRrStart), int(sndRrStart), int(trdRrStart))
    result = runMachine(stringByWords)
    return result




#gui
root = Tk()
root.geometry("310x430")
root.title("Enigma")
root['bg'] = '#FF8F29'

#startentry
startentry = Entry(root, bg='#F7B237', justify=CENTER)
startentry.place(x = 10,y = 10, width=285, height=115)

#company logo
clogo = ImageTk.PhotoImage(Image.open("companylogo.jpg").resize((120, 120)))
logo = Label(root, image = clogo)
logo.place(x=10, y = 150)


def Rotor_add(rotor: Label, count: int = 1):
    rotor.configure(text=rotor["text"] + count)

def Rotor_reset():
    rotor1.configure(text = 0)
    rotor2.configure(text = 0)
    rotor3.configure(text = 0)


#rotters
rotor3btn1 = Button(root, text='<', command=lambda: Rotor_add(rotor3, -1))
rotor3btn2 = Button(root, text='>', command=lambda: Rotor_add(rotor3))

rotor2btn1 = Button(root, text='<', command=lambda: Rotor_add(rotor2, -1))
rotor2btn2 = Button(root, text='>', command=lambda: Rotor_add(rotor2))

rotor1btn1 = Button(root, text='<', command=lambda: Rotor_add(rotor1, -1))
rotor1btn2 = Button(root, text='>', command=lambda: Rotor_add(rotor1))

rotor3btn1.place(x=185, y=250)
rotor3btn2.place(x=250, y=250)
rotor2btn1.place(x=185, y=210)
rotor2btn2.place(x=250, y=210)
rotor1btn1.place(x=185, y=170)
rotor1btn2.place(x=250, y=170)

#

#rotors values

rotor3 = Label(root, fg='black', bg='#FF8F29', text=0)
rotor3.place(x=220, y=250)
rotor2 = Label(root, fg='black', bg='#FF8F29', text=0)
rotor2.place(x=220, y=210)
rotor1 = Label(root, fg='black', bg='#FF8F29', text=0)
rotor1.place(x=220, y=170)

#endentry
endentry = Text(root, bg='#F7B237')
endentry.place(x = 10,y = 305, width=285, height=115)

def Enigma_Start():
    inputString = startentry.get()
    rotor1_get = rotor1['text']
    rotor2_get = rotor2['text']
    rotor3_get = rotor3['text']
    print(rotor1_get,rotor2_get,rotor3_get,inputString)
    result_all = process(rotor1_get,rotor2_get,rotor3_get, inputString)
    endentry.delete(CURRENT, END)
    endentry.insert(END ,result_all)

EncryptBtn = Button(root, text='Encrypt', command = lambda: Enigma_Start())
EncryptBtn.place(x=185, y = 135)
ResetBtn = Button(root, text='Reset', command = lambda: Rotor_reset())
ResetBtn.place(x=245, y = 135)


root.mainloop()

Ответы (0 шт):