2017-11-13 1 views
-2

Ich habe eine Tkinter GUI für das Caesar-Chiffre-Programm, aber es funktioniert nicht richtig. Ich gebe meine Nachricht in das erste Eingabefeld ein, gebe den Schlüssel in das zweite ein und klicke dann auf Verschlüsseln/Entschlüsseln, und das Ergebnis erscheint im dritten Eingabefeld. Aber ich bekomme nie die richtigen Ergebnisse. manchmalTkinter GUI für Caesar Cipher funktioniert nicht wie vorgesehen

Auch wenn ich einen Schlüssel verwenden, die größer als 6 ist, oder mehrere Wörter eingeben, erhalte ich folgende Fehlermeldung:

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 

hier ist der Code:

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() 

Er ist ein Beispiel für den Fehler und was

Beispiel des Fehlers erwartet: Error

Strebtes Ergebnis: Expected

+1

Haben Sie am anderen 100+ sehen „caesar Chiffre funktioniert nicht“ Fragen und Antworten auf SO? Sie alle kommen auf dasselbe zurück. – zaph

+0

@zaph ich habe. Jedoch konnte ich niemanden finden, der tkinter verwendet, der das gleiche Problem wie ich hat –

+1

Haben Sie versucht, tkinter aus der Gleichung herauszunehmen, bis Sie die Verschlüsselung/Entschlüsselung arbeiten, so dass Sie wissen, wo das Problem tatsächlich liegt? –

Antwort

0

Ihre Fehlermeldung wurde aufgrund nicht modulare Arithmetik in Ihrer Encrypt()-Methode (die Sie in Ihrer Decrypt() Methode so implementiert hatten.)

Andere Probleme sind Clearing nicht self.RESULT vor neuen Text hinzufügen ; self.translation nicht löschen, bevor die Ergebnisse einer neuen Übersetzung angehängt werden; nicht kontrollierender Briefkasten; nicht self.RESULT an einer geeigneten Stelle in Ihrem Code aktualisieren (wenn Text in einer Zahl endet, wird es nicht in der Übersetzung wiedergegeben).

ist unter meinem Nacharbeiten des Codes die oben genannten Aspekte ein:

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()