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

Declaring a variable global not working throughout code snippet

下面的代码片段为用户提供了 4 个选项。要么:加密消息,解密消息,更改 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_code global 在我的代码中不起作用。它不起作用的功能是 def display_encryptdef display decryptencryption_code 保持为 LFWOAYUISVKMNXPBDCRJTQEGHZ,即使用户更改了它)而在其他功能中,它工作得很好。

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

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

首先,就像您之前的问题一样,code_change 中的第一个 if 语句不正确。至少有两个答案可以解决这个问题。我建议您返回并重新阅读您在此处接受的答案:.

第二个问题是您没有使用 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))
        ...