2015-10-29 33 views
0

下面是一个给出用户4选项的代码片段。要么:加密消息,解密消息,更改encryption_code或显示encryption_code声明一个变量global不能在整个代码片段中工作

import tkinter 
from tkinter import * 
from tkinter import ttk 
from tkinter.ttk import * 

letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 

encryption_code = 'LFWOAYUISVKMNXPBDCRJTQEGHZ' 
letters += letters.lower() 
encryption_code += encryption_code.lower() 
enc = dict(zip(letters,encryption_code)) 

dec = dict(zip(encryption_code, letters)) 

window = tkinter.Tk()  

style = ttk.Style(window) 
style.configure("BW.TLabel") 

encrypt_frame = tkinter.Frame(window) 

encrypted_frame = tkinter.Frame(window) 

change_frame = tkinter.Frame(window) 
changed_frame = tkinter.Frame(window) 

entry = tkinter.Entry(encrypt_frame) 
encrypt_entry = tkinter.Entry(change_frame) 

encryptget = encrypt_entry.get() 

def code_change(): 
    global changed_frame 
    global encrypt_entry 
    global encryption_code 
    global encryptget 

    if len(encryptget) == 26: 
     encryption_code = encryptget 
     encryption_code += encryption_code.lower() 
     changed_label.configure(background=window.cget('bg')) 
     changed_label.config(text="You have successfully changed the encryption code!") 
     change_header.config(text="Your code is: " + str(encryptget.upper())) 
     changed_frame.pack_forget() 
     changed_label.pack() 
     changed_frame.pack() 


def encrypt(): 
    global encrypt_frame 
    entry.focus_set() 
    entry.pack() 
    encrypt_confirm.pack() 
    back_button.pack() 
    encrypt_frame.pack() 
    first_frame.pack_forget() 

def display_encrypt(): 
    global encryption_code 
    if len(entry.get()) > 0: 
     display_enc = "".join([enc.get(ch, ch) for ch in entry.get()]) 
     entry.delete(0, tkinter.END) 
     new_message.config(background=window.cget('bg')) 
     new_message.config(text=str(display_enc)) 
     new_message.pack() 
     encrypted_frame.pack() 

def back(): 
    new_message.pack_forget() 
    entry.delete(0, tkinter.END)  
    first_frame.pack() 
    encrypt_frame.pack_forget() 
    encrypted_frame.pack_forget() 
    change_frame.pack_forget() 
    changed_frame.pack_forget() 

def change_code(): 
    global change_frame 
    encrypt_entry.focus_set() 
    encrypt_entry.pack() 
    change_confirm.pack() 
    back_button4.pack() 
    change_frame.pack() 
    first_frame.pack_forget() 

first_frame = tkinter.Frame(window) 
encrypt_button = ttk.Button(first_frame, text="Encrypt", width=20, command=encrypt) 
change_code = ttk.Button(first_frame, text="Change code", width=20, command=change_code) 
encrypt_button.pack() 
change_code.pack() 
first_frame.pack() 

back_button = ttk.Button(encrypt_frame, text="Back", width=20, command=back) 
back_button4 = ttk.Button(change_frame, text="Back", width=20, command=back) 

encrypt_confirm = ttk.Button(encrypt_frame, text="Confirm", width=20, command=display_encrypt) 

new_message = tkinter.Label(encrypted_frame, text="", font=('Helvetica', 10)) 

change_confirm = ttk.Button(change_frame, text="Confirm", width=20, command=code_change) 

window.mainloop() 

我的问题是声明encryption_code全局不起作用在我的代码。它不起作用的功能是def display_encryptdef display decrypt(即使用户更改了它,encryption_code仍保持为LFWOAYUISVKMNXPBDCRJTQEGHZ),而在其他功能中,它可以很好地工作。

例如,您将加密代码更改为QWERTYUIOPASDFGHJKLZXCVBNM,然后进行加密并键入ABC。它应该被加密到QWE,而是被加密到LFW(原始加密代码)

+0

请把这个下降到[MCVE。 – Teepeemm

+0

但是为了告诉你它是如何工作的,我需要所有这些,或者我应该只显示出现错误的位置? – Inkblot

+0

你在这里有一些和你之前的问题一样的错误。 'code_change'中的第一个'if'语句是错误的。表达将永远是真实的。 –

回答

1

你的代码中至少有两个bug,或许更多。

首先,就像您在上一个问题中一样,您在code_change中的第一条if语句不正确。至少有两个解决这个问题的答案。我建议你回去重新阅读你在这里接受的答案:https://stackoverflow.com/a/33411642/7432

第二个问题是您没有使用encrypton_code来进行加密,您使用的是enc(以及类似的dec的描述)。 当用户输入另一个加密字符串时,您从不更改这些变量。因为你从不改变它们,所以你加密的每个字符串都使用原始的加密字符串。

的解决方案是在code_change更新encdec

def code_change(): 
    global enc, dec 
    ... 
    if len(encryptget) == 26: 
     ... 
     enc = dict(zip(letters,encryption_code)) 
     dec = dict(zip(encryption_code, letters)) 
     ... 
相关问题