声明变量全局在整个代码段中不起作用

时间:2015-10-29 20:32:38

标签: python variables tkinter global

下面是一个代码段,为用户提供了4个选项。要么:加密邮件,解密邮件,更改<M-CR>或显示encryption_code

encryption_code

我的问题是在我的代码中声明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_codedef display_encryptdef display decrypt保持为LFWOAYUISVKMNXPBDCRJTQEGHZ,即使用户已更改它),而在其他函数中,它完美地运行。

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

1 个答案:

答案 0 :(得分:1)

您的代码中至少有两个错误,可能更多。

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

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

解决方案是更新enc中的deccode_change

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