0
votes

I can set the variable and print it directly after if choice == 1. But if choice == 2 i cant print it out the text that was set, I get an error.

(UnboundLocalError: local variable 'text_in_use' referenced before assignment)

How can i fix this?

text_in_use = ''
encrypt_key = ''

def menu():
    choice = int(input("""1: Input text to work with
2: Print the current text
3: Encrypt the current text
4: Decrypt the current text
5: Exit
Enter Choice: """))

    if choice == 1:
       text_in_use = str(input("Enter Text: ")).upper()
       print("Text to use was set to:", text_in_use)
       menu()
    elif choice == 2:
        print(text_in_use) #this is where i get the error <-----
        menu()
    elif choice == 3:
        print("3")
        menu()
    elif choice == 4:
        #decrypt()
        print("4")
        menu()
    elif choice == 5:
        #exit()
        print("5")
        menu()

menu()

i just want it to print the text that was set.

2
move the text_in_use = str(input("Enter Text: ")).upper() before the if statement begins.lmiguelvargasf
You're calling menu() again after each input, and the next execution of menu() doesn't remember the text that was entered in the previous execution. It's probably best to rearrange your code so that all the logic happens within the same execution.John Gordon

2 Answers

0
votes

-- Hi Linus,

Your variable

text_in_use

only is set if your first condition is met. So if your codes skips that condition and moves on to:

elif choice == 2

the variable hasn't been set yet.

Since, the function recursively calls itself after every option, you also can't add the variable before the first clause as I initially suggested.

So I'm changing my answer to the following:

At this point I would also like to add that a function without any exit may not be what you ultimately want to use. So I commented out the recursive call in option 5.

My suggestion is to use a simple class:

class Menu:
  def __init__(self):
    self.text_in_use = ''
    self.encrypt_key = ''

    self.build_menu()

  def build_menu(self):

    choice = int(input(
      """
      1: Input text to work with
      2: Print the current text
      3: Encrypt the current text
      4: Decrypt the current text
      5: Exit

      Enter Choice: 
      """
    ))

    if choice == 1:
      self.text_in_use = str(input("Enter Text: ")).upper()
      print("Text to use was set to:", self.text_in_use)
      self.build_menu()
    elif choice == 2:
      print(self.text_in_use)
      self.build_menu()
    elif choice == 3:
      print("3")
      self.build_menu()
    elif choice == 4:
      #decrypt()
      print("4")
      self.build_menu()
    elif choice == 5:
      #exit()
      print("5")
      # self.build_menu() do not call this again so it actually exits.

Menu()
0
votes

You should mark text_in_use variable as global. You reference it in function from outer scope

def menu():
    global text_in_use
    choice = int(input("your_text"))

   #rest of code