Search code examples
pythontkinternameerror

NameError: name 'fooAlpha' is not defined


I'm getting the NameError: name 'fooAlpha' is not defined when I run my script. From research I believe it's because I've not declared fooAlpha early in the script. However even if put fooAlpha = "" around line 22 I still get an error. I feel I'm lacking just that small bit of understanding of python to get beyond this error. Please can I get some pointers on how to solve this.

#   CAESAR CIPHER - PART 6 
#   Add a GUI
#   - by JeffGames
#   
#
#
# ToDo: 
# 1. Add JeffGames icon
# 2. Handle spaces in the string


# Import tkinter, our GUI framework
from tkinter import * # Import tkinter, our GUI framework

root = Tk()

# Variables used by the main program.
alphabet01 = 'GjlZCMaQKU"/-Xf$£\\mrw:>H(%Fo&tD<!gJLzbiSxBcT,dqPYy=*OA~_?^.)E;evN+R#k\'@hnIuVWsp'
alphabet02 = 'hkS*F>ucL/l-)VPB£iR\\ZUdI\'CQ$z(@?=f<ta:m#Wvp;~n!Yg."^sxMHNKDwybjr_,O%oq+TJGXAEe&'
alphabet03 = '(OIce$TnM=JvF?j<&X+S>i\\h"EY\'dK£,lq!Z@~QmbyD-wUWNsrV^H:fB.aPpkL_otC/);RzAGxg%*#u'

# Define what happens when the go button is clicked

def clickAlpha():
    print("Alphabet from clickAlpha = ", algo.get()) # Calls algo and prints its value
    myAlpha = algo.get()
    print("myAlpha = ", myAlpha) # debug printing
    if myAlpha == "Alpha1":
        print(alphabet01) # debug printing
        fooAlpha = alphabet01
    elif myAlpha == "Alpha2":
        print(alphabet02) # debug printing
        fooAlpha = alphabet02
    else:
        print(alphabet03) # debug printing
        fooAlpha = alphabet03


def clickEncrypt():
    msgEncrypt = msgInput.get()
    msgEncrypt = str(msgEncrypt)
    #print(msgEncrypt) # Used for debugging
    caesarShift = cesar.get()
    caesarShift = int(caesarShift)
    useAlpha = fooAlpha
    useAlpha = str(useAlpha)
    print(useAlpha) # Used for debugging
    newMessage = ""

    for character in msgEncrypt:
        if character in useAlpha:
            position = useAlpha.find(character) 
            # NB: len(alphabet) handles a list of any length
            newPosition = (position + caesarShift)%len(useAlpha) 
            newCharacter = useAlpha[newPosition]
            newMessage += newCharacter
            #Put the new message into the message output field        
            msgOutput.delete(0, END) # Clear the output field after GO is clicked
            # Ans = str(newMessage) # Read message for putting into the output field
            msgOutput.insert(0, newMessage) #(0, Ans) # Put the message from input field into

def clickDecrypt():
    print("Decrypt pressed")
    msgEncrypt = msgInput.get()
    msgEncrypt = str(msgEncrypt)
    #print(msgEncrypt) # Used for debugging
    caesarShift = cesar.get()
    caesarShift = int(caesarShift)
    useAlpha = fooAlpha # Hard coding the algo
    useAlpha = str(useAlpha)
    print(useAlpha) # Used for debugging
    newMessage = ""

    for character in msgEncrypt:
        if character in useAlpha:
            position = useAlpha.find(character) 
            # NB: len(alphabet) handles a list of any length
            newPosition = (position - caesarShift)%len(useAlpha) 
            newCharacter = useAlpha[newPosition]
            newMessage += newCharacter
            #Put the new message into the message output field        
            msgOutput.delete(0, END) # Clear the output field after GO is clicked
            # Ans = str(newMessage) # Read message for putting into the output field
            msgOutput.insert(0, newMessage) #(0, Ans) # Put the message from input field into

def moveCaesar(sld): # A variable must be in here for the function to work
    print("Shift = ", cesar.get()) # Calls cesar variable and prints its value

def clickClear():
    msgInput.delete(0, END)
    msgOutput.delete(0, END)
    print("Cleared all messages")

def clickCopy():
    return # Will eventually copy the decrypted or encrypted text to clipboard

def clickQuit(): # Created to have a pop-up to confirm quit.
    btnExit(command=root.quit)

# Set up for the Alphabet being used. Alphabet 1 is default
algo = StringVar()
algo.set("Alpha1") # Sets Alphabet 1 as default
print("Initial alphabet: ", algo.get()) # Calls algo.set and prints its value

# Set up for the Casar shift. 0 is the default
cesar = IntVar()
cesar.set(1)
print("Initial shift: ", cesar.get()) # Calls cesar variable and prints its value

# SET UP THE CANVAS
root.title("Caesar Cipher by JeffGames")


#   ---------------------------------------------------
#   SET UP THE BUTTONS, Message boxes, and input areas
#   ---------------------------------------------------

# Welcome message
welcFrame = LabelFrame(root, padx=10, pady=10, bg='blue')
lblWelcome = Label(welcFrame, text="Welcome to the Caesar Cipher program", bg='blue', fg='white') 

# Input message box with a heading instructing user to paste or type message
lblMsgIn = Label(root, text="STEP 1 - Type or paste your message in the box below.")
msgInput = Entry(root)

# Alphabet choices
alphaFrame = LabelFrame(root, padx=10, pady=10, bg='green')
lblAlphaChoice = Label(alphaFrame, text=" STEP 2 - Now choose your encryption algo")
btnAlpha1 = Radiobutton(alphaFrame, text="Alphabet 1", variable=algo, value="Alpha1", command=clickAlpha) 
btnAlpha2 = Radiobutton(alphaFrame, text="Alphabet 2", variable=algo, value="Alpha2",command=clickAlpha) 
btnAlpha3 = Radiobutton(alphaFrame, text="Alphabet 3", variable=algo, value="Alpha3",command=clickAlpha) 

# Caesar shift slider
caesarFrame = LabelFrame(root, padx=10, pady=10, bg='red')
lblCaesar = Label(caesarFrame, text=" STEP 3 - Now set your Caesar Shift")
sldrCaesar = Scale(caesarFrame, from_=0, to=80, variable=cesar, orient=HORIZONTAL, command=moveCaesar)

# Encrypt / Decrypt user choices
cryptFrame = LabelFrame(root, padx=10, pady=10, bg='pink')
lblCryptMsg = Label(cryptFrame, text="STEP 1 - Press a button to Encrypt or Decrypt a message", padx=5, pady=5)
btnCrypt1 = Button(cryptFrame, text="Encrypt", command=clickEncrypt)
btnCrypt2 = Button(cryptFrame, text="Decrypt", command=clickDecrypt) 

#Output box
msgOutput = Entry(root)

# Clear, Copy to clipboard, and Exit  buttons
btnClear = Button(root, text="Clear All", command=clickClear)   
btnCopy = Button(root, text="Copy to clipboard", command=clickCopy)
btnExit = Button(root, text="Quit", command=root.quit)

#   -----------------------------
#   PUT THE BUTTONS ON THE SCREEN
#   -----------------------------

# ROW 0 - Welcome message
welcFrame.grid(row=0, columnspan=3, sticky=W+E)
lblWelcome.grid(row=0, column=0, columnspan=3)

# ROW 1 & 2 - User's Message input heading and area
lblMsgIn.grid(row=1, column=0, columnspan=3)
msgInput.grid(row=2, column=0, columnspan=3, sticky=W+E)

# ROW 3 & 4 - Choose Alphabet button and message placement
alphaFrame.grid(row=3, columnspan=3, sticky=W+E)
lblAlphaChoice.grid(row=3, column=0, columnspan=3, sticky=W)
btnAlpha1.grid(row=4, column=0)
btnAlpha2.grid(row=4, column=1)
btnAlpha3.grid(row=4, column=2)

# ROW 5 & 6 Caesar shift slider
caesarFrame.grid(row=5, columnspan=3, sticky=W+E)
lblCaesar.grid(row=5, column=0, columnspan=3, sticky=W)
sldrCaesar.grid(row=6, column=0, columnspan=3, sticky=W+E)

# ROW 7 & 8 - Encrypt Decrypt button and message placement
cryptFrame.grid(row=7, columnspan=3, sticky=W+E)
lblCryptMsg.grid(row=7, column=0, columnspan=3, sticky=W)
btnCrypt1.grid(row= 8, column=0)
btnCrypt2.grid(row= 8, column=1)

# ROW 0 - User's Message ouput heading and area
msgOutput.grid(row=9, column=0, columnspan=3, sticky=W+E)

# ROW 10 - Clear Messages & Copy to clipboard, Exit program button placement
btnClear.grid(row=10, column=0)
btnCopy.grid(row=10, column=1)
btnExit.grid(row=10, column=2)

# tkinter mainloop
root.mainloop()

Solution

  • You're using fooAlpha inside clickEncrypt and clickDecrypt without defining what is it, define it first, and then use the global keyword inside the functions where you're changing it (clickAlpha). First part of your code should be like:

    # Define what happens when the go button is clicked
    fooAlpha = ''                 # <========= Add this
    def clickAlpha():
        global fooAlpha           # <========= Add this
        # rest of code