fluttershy...@gmail.com wrote:

> Inside the function is where I am having the problem, I am trying to get
> it to delete the label so that it may then replace it with a shorter text.
> Here is the full code:

> def check1():
>     entry = entry1var.get()
>     if entry == num1:
>         labelent1.destroy()
>         labelent1 = Label(main, text="Correct!",fg="green").grid(row = 0,
>         column = 3)
>     elif entry > num1:
>         labelent1.destroy()
>         labelent1 = Label(main, text="Too Big",fg="red").grid(row = 0,
>         column = 3)
>     elif entry < num1:
>         labelent1.destroy()
>         labelent1 = Label(main, text="Too Small",fg="red").grid(row = 0,
>         column = 3)

> And this is the error displayed when clicking on button1:
> 
> Exception in Tkinter callback
> Traceback (most recent call last):
>   File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
>     return self.func(*args)
>   File "C:/Users/User/Desktop/Programming/Tkinter/Tkinter.py", line 15, in
>   check1
>     labelent1.destroy()
> UnboundLocalError: local variable 'labelent1' referenced before assignment
> 
> 
> Thanks, Lewis.

Kudos, your problem description is very clear!

Your post would be perfect, had you reduced the number of Labels from three 
to one ;)

The error you are seeing has nothing to do with the GUI. When you assign to 
a name inside a function Python determines that the name is local to that 
function. A minimal example that produces the same error is

>>> a = "global"
>>> def test():
...     print(a)
...     a = "local"
... 
>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test
UnboundLocalError: local variable 'a' referenced before assignment

The name `a` passed to print() references the local `a` which is not yet 
defined. A possible fix is to tell Python to reference the global `a`

>>> a = "global"
>>> def test():
...     global a
...     print(a)
...     a = "local"
... 
>>> test()
global
>>> a
'local'

However, in the case of your GUI code you should not destroy and create 
Label instances -- it is more efficient (and easier I think) to modify the 
Label's text:

(1) working demo with 'global' -- don't do it that way:

from tkinter import *

main = Tk()

def check1():
    global labelent1
    labelent1.destroy()
    labelent1 = Label(main, text="Correct!", fg="green")
    labelent1.grid(row = 0, column = 3) # must be a separate statement as
                                        # grid() returns None

Button(main, text="Try Number", command=check1).grid(row=0, column=2)
labelent1 = Label(main, text="Waiting for Input")
labelent1.grid(row=0, column=3) # must be a separate statement as 
                                # grid() returns None

main.mainloop()


(2) The way to go, modify the label text instead of replacing it:

from tkinter import *

main = Tk()

def check1():
    labelent1.configure(text="Correct!", fg="green")

Button(main, text="Try Number", command=check1).grid(row=0, column=2)
labelent1 = Label(main, text="Waiting for Input")
labelent1.grid(row=0, column=3)

main.mainloop()

> global num1

By the way, global declarations on the module level have no effect.


-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to