Python 凯撒密码的Tkinter GUI';我不能如愿工作

Python 凯撒密码的Tkinter GUI';我不能如愿工作,python,tkinter,caesar-cipher,Python,Tkinter,Caesar Cipher,我为凯撒密码程序制作了一个tkinter GUI,但它不能正常工作。 我在第一个输入框中键入消息,在第二个输入框中输入密钥,然后单击加密/解密,结果显示在第三个输入框中。但我从未得到正确的结果 此外,有时如果我使用高于6的键,或输入多个单词,则会出现以下错误: Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\PC\AppData\Local\Programs\Python\Python

我为凯撒密码程序制作了一个tkinter GUI,但它不能正常工作。 我在第一个输入框中键入消息,在第二个输入框中输入密钥,然后单击加密/解密,结果显示在第三个输入框中。但我从未得到正确的结果

此外,有时如果我使用高于6的键,或输入多个单词,则会出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\PC\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1549, in __call__
return self.func(*args)
File "C:/Users/PC/PycharmProjects/oyun/sezarUIing.py", line 33, in Encrypt
self.translation = self.translation + self.LETTERS[sayı]
IndexError: string index out of range
代码如下:

from tkinter import *

class Sezar(Frame):
    def __init__(self,pencere):
        Frame.__init__(self,pencere)
        self.pencere = pencere

        self.Lab1 = Label(pencere, text="Enter your message: ",relief= GROOVE, width=20).place(x=20,y=30)

        self.Lab2 = Label(pencere, text="Enter key: ", relief=GROOVE, width=20).place(x=20, y=90)

        self.Ent1 = Entry(pencere,width=30)
        self.Ent1.place(x=170,y=30)

        self.Ent2 = Entry(pencere,width=30)
        self.Ent2.place(x=170,y=90)

        self.But1 = Button(pencere, text="Encrypt", relief=GROOVE,font="bold",command= self.Encrypt).place(x=50,y=150)
        self.But1 = Button(pencere, text="Decrypt", relief=GROOVE, font="bold",command= self.Decrypt).place(x=110, y=150)

        self.RESULT = Entry(pencere, width=30)
        self.RESULT.place(x=170,y=200)

        self.LETTERS = "abcdefghijklmnopqrstuvwxyz"
        self.translation = ""


    def Encrypt(self):
        for num in self.Ent1.get():
            if num in self.LETTERS:
                sayı = self.LETTERS.find(num)
                sayı = sayı + int(self.Ent2.get())
                self.translation = self.translation + self.LETTERS[sayı]
                self.RESULT.insert(0,self.translation)
            else:
                self.translation = self.translation + num


    def Decrypt(self):
        for num in self.Ent1.get():
            if num in self.LETTERS:
                sayı = self.LETTERS.find(num)
                sayı = sayı - int(self.Ent2.get())
                if sayı >= 0:
                    sayı = sayı - len(self.LETTERS)
                elif sayı <= 0:
                    sayı = sayı + len(self.LETTERS)
                self.translation = self.translation + self.LETTERS[sayı]
                self.RESULT.insert(0,self.translation)
            else:
                self.translation = self.translation + num

if __name__ == "__main__":
    root = Tk()
    root.title("Sezar")
    root.geometry("400x300+50+50")
    Sezar(root).pack(side="top",fill = "both")
    root.mainloop()
从tkinter导入*
Sezar级(框架):
定义初始化(self,pencere):
帧。初始帧(self,pencere)
self.pencere=pencere
self.Lab1=标签(pencere,text=“输入您的消息:”,浮雕=凹槽,宽度=20)。放置(x=20,y=30)
self.Lab2=标签(pencere,text=“回车键:”,浮雕=凹槽,宽度=20)。放置(x=20,y=90)
self.Ent1=条目(铅笔,宽度=30)
self.Ent1.place(x=170,y=30)
self.Ent2=条目(铅笔,宽度=30)
self.Ent2.place(x=170,y=90)
self.But1=按钮(pencere,text=“Encrypt”,relief=GROOVE,font=“bold”,command=self.Encrypt)。放置(x=50,y=150)
self.But1=按钮(pencere,text=“Decrypt”,relief=GROOVE,font=“bold”,command=self.Decrypt)。放置(x=110,y=150)
self.RESULT=条目(铅笔,宽度=30)
self.RESULT.place(x=170,y=200)
self.LETTERS=“abcdefghijklmnopqrstuvxyz”
self.translation=“”
def加密(自我):
对于self.Ent1.get()中的num:
如果num以self.LETTERS表示:
sayı=self.LETTERS.find(num)
sayı=sayı+int(self.Ent2.get())
self.translation=self.translation+self.LETTERS[sayı]
self.RESULT.insert(0,self.translation)
其他:
self.translation=self.translation+num
def解密(自我):
对于self.Ent1.get()中的num:
如果num以self.LETTERS表示:
sayı=self.LETTERS.find(num)
sayı=sayı-int(self.Ent2.get())
如果说ı>=0:
sayı=sayılen(self.LETTERS)

elif sayı您的错误消息是由于您在
Encrypt()
方法中未使用模块化算法(您在
Decrypt()
方法中实现了这种算法)

其他问题包括在添加新文本之前未清除
self.RESULT
;在添加新翻译的结果之前,未清除
self.translation
;不控制字母大小写;不在代码中的适当位置更新
self.RESULT
(如果文本以数字结尾,则不会反映在翻译中)

下面是我针对上述问题对您的代码进行的修改:

from tkinter import *

class Sezar(Frame):
    LETTERS = "abcdefghijklmnopqrstuvwxyz"

    def __init__(self, pencere):
        Frame.__init__(self, pencere)
        self.pencere = pencere

        Label(pencere, text="Enter your message: ", relief=GROOVE, width=20).place(x=20, y=30)
        self.Ent1 = Entry(pencere, width=30)
        self.Ent1.place(x=170, y=30)

        Label(pencere, text="Enter key: ", relief=GROOVE, width=20).place(x=20, y=90)
        self.Ent2 = Entry(pencere, width=30)
        self.Ent2.place(x=170, y=90)

        Button(pencere, text="Encrypt", relief=GROOVE, font="bold", command=self.Encrypt).place(x=50, y=150)
        Button(pencere, text="Decrypt", relief=GROOVE, font="bold", command=self.Decrypt).place(x=110, y=150)

        self.RESULT = Entry(pencere, width=30)
        self.RESULT.place(x=170, y=200)

    def Encrypt(self):
        key = int(self.Ent2.get())
        length = len(self.LETTERS)

        translation = ''

        for character in self.Ent1.get():
            if character.lower() in self.LETTERS:
                sayı = self.LETTERS.find(character.lower())
                sayı = (sayı + key) % length
                translation += self.LETTERS[sayı]
            else:
                translation += character

        self.RESULT.delete(0, END)
        self.RESULT.insert(0, translation)

    def Decrypt(self):
        key = int(self.Ent2.get())
        length = len(self.LETTERS)

        translation = ''

        for character in self.Ent1.get():
            if character.lower() in self.LETTERS:
                sayı = self.LETTERS.find(character.lower())
                sayı = (sayı - key) % length
                translation += self.LETTERS[sayı]
            else:
                translation += character

        self.RESULT.delete(0, END)
        self.RESULT.insert(0, translation)

if __name__ == "__main__":
    root = Tk()
    root.title("Sezar")
    root.geometry("400x300+50+50")
    Sezar(root).pack(side="top", fill="both")
    root.mainloop()

你看过其他100多个“凯撒密码不起作用”的问题和答案了吗?“他们都归结到同一件事上,”扎夫说。但是,我找不到任何使用tkinter的人和我有相同的问题。你有没有尝试过把tkinter从等式中去掉,直到你的加密/解密工作正常,这样你才知道问题到底出在哪里?@Bryan Oakley是的,我有,原来的程序运行得很好。但它不是面向对象的,所以问题可能与此有关。