Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

local variable referenced before assignment with try and except statement [duplicate]

I'm having some issues with the try and except statements, I have an entry widget that takes input in strings but I have code which converts it to a integer later, problem is if the user inputs something like text it throws an error like this:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.2/tkinter/__init__.py", line 1402, in __call__
    return self.func(*args)
  File "/home/ppppwn3d/workspace/Python/JailBreakBob/JailBreakBob.py", line 157, in buttonclick_gamescreen
    entryx = int(e1.get())
ValueError: invalid literal for int() with base 10: 'abc'

So I wanted to hide the error with the try and except statements but I now get another error message.

This is what it looks like in the code.

    while pressed == 8 :
        try:
            entryx = int(e1.get())
            entryy = int(e2.get())
        except ValueError:
            print("text")

        answerx = answerlistx[randomimage]
        answery = answerlisty[randomimage]
    
        if entryx == answerx and entryy == answery
            canvas.delete(images)
            randomimage = random.randrange(0,49+1)
            scorecounter = scorecounter + 1
            game = PhotoImage(file=imagelist[randomimage])
            images = canvas.create_image(30, 65, image = game, anchor = NW)
            e1.delete(0, END)   
            e2.delete(0, END)
            pressed = ''
        if entryx > 10 or entryx < -10 or entryy > 10 or entryy < -10 :
            wrong = canvas.create_image(30, 65, image = outside, anchor = NW)
            e1.delete(0, END)   
            e2.delete(0, END)
            pressed = ''
        else:
            wrong = canvas.create_image(30, 65, image = incorrect, anchor = NW)
            e1.delete(0, END)   
            e2.delete(0, END)
            pressed = ''

The new error message:

text
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.2/tkinter/__init__.py", line 1402, in __call__
    return self.func(*args)
  File "/home/ppppwn3d/workspace/Python/JailBreakBob/JailBreakBob.py", line 165, in buttonclick_gamescreen
    if entryx == answerx and entryy == answery:
UnboundLocalError: local variable 'entryx' referenced before assignment

I can't figure out why this is happening and how to fix it so any help would be appreciated.

like image 247
ThatsNotMyName Avatar asked Aug 11 '13 09:08

ThatsNotMyName


People also ask

How do I fix local variable might be referenced before assignment?

The Python "UnboundLocalError: Local variable referenced before assignment" occurs when we reference a local variable before assigning a value to it in a function. To solve the error, mark the variable as global in the function definition, e.g. global my_var .

How do you avoid local variables before assignment?

The UnboundLocalError: local variable referenced before assignment error is raised when you try to assign a value to a local variable before it has been declared. You can solve this error by ensuring that a local variable is declared before you assign it a value.


1 Answers

To add to @alecxe's answer, I would rather modify the program like so:

    entryx, entryy = 0, 0
    try:
        entryx = int(e1.get())
        entryy = int(e2.get())
    except ValueError:
        print("text")

Basically, what the error means is that in case of an error, entryx, entryy never get assigned anything, but still get referenced later in the if..else check.

It's best to have default values for the variables outside of the try..except block.

like image 192
KGo Avatar answered Sep 28 '22 09:09

KGo