Inkblot
Inkblot

Reputation: 738

Declaring a variable global not working throughout code snippet

Below is a code snippet which gives the user 4 options. To either: encrypt a message, decrypt a message, change the encryption_code or to show the 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()

My problem is that declaring encryption_code global is not working throughout my code. The functions where it doesn't work is def display_encrypt and def display decrypt (the encryption_code stays as LFWOAYUISVKMNXPBDCRJTQEGHZ even if the user has changed it) whereas in other functions, it works perfectly.

For example, you change the encryption code to QWERTYUIOPASDFGHJKLZXCVBNM and then go to encrypt and type ABC. It should be encrypted to QWE but instead is encrypted to LFW(the original encryption code)

Upvotes: 0

Views: 50

Answers (1)

Bryan Oakley
Bryan Oakley

Reputation: 385830

There are at least two bugs in your code, perhaps more.

First, just like in your previous question, your first if statement in code_change is incorrect. There are at least two answers that address this. I suggest you go back and re-read the answer you accepted here: https://stackoverflow.com/a/33411642/7432.

The second issue is that you're not using encrypton_code to do the encryption, you are using enc (and similarly, dec for description). You never change these variables when the user enters another encryption string. Because you never change them, every string you encrypt uses the original encryption string.

The solution is to update enc and dec in code_change:

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

Upvotes: 1

Related Questions