473,509 Members | 3,543 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Tkinter WEIRDNESS or Python WEIRDNESS?

In a nutshell, my problem is that I am getting this runtime error, and
I have no clue why. Please bear in mind its my first python program:

"localvariable 'currentAbility' referenced before asignment"

in this function which is a callback for a button:

def nextThing():
if lookingAtAbilities == 1:
currentAbility = currentAbility + 1
if currentAbility not in ability:
currentAbility = 0
clearScreen()
ability[currentAbility].draw(currentAbility)
drawMainButtons()
else:
currentCreature = currentCreature + 1
if currentCreature not in creature:
currentCreature = 0
clearScreen()
creature[currentCreature].draw(currentCreature)
drawMainButtons()

now the thing is, both lookingAtAbilities and currentAbility are
global variables. In fact, they are both assigned at the same part of
the program, right at the start. yet lookingAtAbilities is
recognized as a global by this function, and currentAbility is not,
generating this runtime error.

here is the structure of the code:

----------------------------------------
import string
import types
from Tkinter import *

# globals
lookingAtAbilities = 1
currentAbility = 2

(snip: some class and function definitions)

def nextThing():
if lookingAtAbilities == 1:
currentAbility = currentAbility + 1
if currentAbility not in ability:
currentAbility = 0
clearScreen()
ability[currentAbility].draw(currentAbility)
drawMainButtons()
else:
currentCreature = currentCreature + 1
if currentCreature not in creature:
currentCreature = 0
clearScreen()
creature[currentCreature].draw(currentCreature)
drawMainButtons()

def drawMainButtons():
back = Button(win, text="prev", command=prevThing)
back.grid(row=20, column=0)
next = Button(win, text="next", command=nextThing)
next.grid(row=20, column=1)

# START OF EXECUTION #

masterWin = Tk()
win = Frame(masterWin)
win.grid()

drawMainButtons()
masterWin.mainloop()
------------------------------------------

This has me flumoxed

thanks if you can work it out,

Steve
Jul 18 '05 #1
4 1353
steve said unto the world upon 2005-03-12 00:06:
In a nutshell, my problem is that I am getting this runtime error, and
I have no clue why. Please bear in mind its my first python program:

"localvariable 'currentAbility' referenced before asignment"

in this function which is a callback for a button:

def nextThing():
if lookingAtAbilities == 1:
currentAbility = currentAbility + 1
if currentAbility not in ability:
currentAbility = 0
clearScreen()
ability[currentAbility].draw(currentAbility)
drawMainButtons()
else:
currentCreature = currentCreature + 1
if currentCreature not in creature:
currentCreature = 0
clearScreen()
creature[currentCreature].draw(currentCreature)
drawMainButtons()

now the thing is, both lookingAtAbilities and currentAbility are
global variables. In fact, they are both assigned at the same part of
the program, right at the start. yet lookingAtAbilities is
recognized as a global by this function, and currentAbility is not,
generating this runtime error.

here is the structure of the code:
<SNIP>
This has me flumoxed

thanks if you can work it out,

Steve


Hi Steve,

While both lookingAtAbilities and currentAbility are names in the
global namespace, nextThing() doesn't know that ;-).

The first mention of if lookingAtAbilities in nextThing() is:
.. if lookingAtAbilities == 1:
This is a reference to the name, so the interpreter fetches
lookingAtAbilities value from the first namespace in which it finds
such a name. (The global namespace.)

By contrast, the first mention of currentAbility is:
.. currentAbility = currentAbility + 1
So, the interpreter `creates' (I am a bit fuzzy on the terminology and
not an accomplished Pythoner) a name in the function local namespace
and then looks to see what value to point the name at. When it sees it
should have currentAbility (a name without a value as yet) point to
currentAbility + 1, it barfs.

One way to fix it, is to put `global currentAbility' at the top of
your function definition. (Many frown on globals as it messes with the
namespaces, and gives bad mojo.)

Another would be to pass currentAbility in to your function as an
argument.

Yet another (and probably the best) would be to wrap your code into a
class and then reference self.currentAbility.

Still another (but one not so good for clarity or beauty) would be to
put a line like:
temp = currentAbility # temp a name to reference global scope name
# before assignment to follow.

Perhaps more expert voices will chime in and say better things. :-)

HTH,

Brian vdB
Jul 18 '05 #2
steve wrote:
In a nutshell, my problem is that I am getting this runtime error, and
I have no clue why. Please bear in mind its my first python program:

"localvariable 'currentAbility' referenced before asignment"


If you're assigning an object to a name, it will be assigned to that
name in local namespace. So, in your case, you are doing augmented
assignment on a local name that does not yet exist (hence the error
message). You need to tell the interpreter that what you want is assign
to that name in global namespace. You can do this by using the 'global'
statement, as in:
my_global = 1
def some_func():
.... global my_global
.... my_global += 1 some_func()
my_global

2
--

Vincent Wehren
Jul 18 '05 #3
Brian van den Broek <bv****@po-box.mcgill.ca> wrote in message news:<ma*************************************@pyth on.org>...
steve said unto the world upon 2005-03-12 00:06:
In a nutshell, my problem is that I am getting this runtime error, and
I have no clue why. Please bear in mind its my first python program:

"localvariable 'currentAbility' referenced before asignment"

in this function which is a callback for a button:
now the thing is, both lookingAtAbilities and currentAbility are
global variables. In fact, they are both assigned at the same part of
the program, right at the start. yet lookingAtAbilities is
recognized as a global by this function, and currentAbility is not,
generating this runtime error.

here is the structure of the code:
<SNIP>
This has me flumoxed

thanks if you can work it out,

Steve


Hi Steve,

While both lookingAtAbilities and currentAbility are names in the
global namespace, nextThing() doesn't know that ;-).

The first mention of if lookingAtAbilities in nextThing() is:
. if lookingAtAbilities == 1:
This is a reference to the name, so the interpreter fetches
lookingAtAbilities value from the first namespace in which it finds
such a name. (The global namespace.)

By contrast, the first mention of currentAbility is:
. currentAbility = currentAbility + 1
So, the interpreter `creates' (I am a bit fuzzy on the terminology and
not an accomplished Pythoner) a name in the function local namespace
and then looks to see what value to point the name at. When it sees it
should have currentAbility (a name without a value as yet) point to
currentAbility + 1, it barfs.


Thanks to both of you, this has fixed the problem. I wouldnt have
guessed that in a million years.

But it leads me to ask what is the use of something being in the
gloabl namespace if it cant be accessed globally?

I also find the continual need for objects to reference their own
variables by prefixing 'self' annoying. It seems that Python is the
reverse of my assuptions. whats the rationale for that?
One way to fix it, is to put `global currentAbility' at the top of
your function definition. (Many frown on globals as it messes with the
namespaces, and gives bad mojo.)

Another would be to pass currentAbility in to your function as an
argument.

Yet another (and probably the best) would be to wrap your code into a
class and then reference self.currentAbility.

Still another (but one not so good for clarity or beauty) would be to
put a line like:
temp = currentAbility # temp a name to reference global scope name
# before assignment to follow.

Perhaps more expert voices will chime in and say better things. :-)

HTH,

Brian vdB

Jul 18 '05 #4
steve said unto the world upon 2005-03-12 18:46:
Brian van den Broek <bv****@po-box.mcgill.ca> wrote in message news:<ma*************************************@pyth on.org>...
steve said unto the world upon 2005-03-12 00:06:
In a nutshell, my problem is that I am getting this runtime error, and
I have no clue why. Please bear in mind its my first python program:

"localvariable 'currentAbility' referenced before asignment"

in this function which is a callback for a button:
now the thing is, both lookingAtAbilities and currentAbility are
global variables. In fact, they are both assigned at the same part of
the program, right at the start. yet lookingAtAbilities is
recognized as a global by this function, and currentAbility is not,
generating this runtime error.

here is the structure of the code:
<SNIP>
This has me flumoxed

thanks if you can work it out,

Steve


Hi Steve,

While both lookingAtAbilities and currentAbility are names in the
global namespace, nextThing() doesn't know that ;-).

The first mention of if lookingAtAbilities in nextThing() is:
. if lookingAtAbilities == 1:
This is a reference to the name, so the interpreter fetches
lookingAtAbilities value from the first namespace in which it finds
such a name. (The global namespace.)

By contrast, the first mention of currentAbility is:
. currentAbility = currentAbility + 1
So, the interpreter `creates' (I am a bit fuzzy on the terminology and
not an accomplished Pythoner) a name in the function local namespace
and then looks to see what value to point the name at. When it sees it
should have currentAbility (a name without a value as yet) point to
currentAbility + 1, it barfs.

Thanks to both of you, this has fixed the problem. I wouldnt have
guessed that in a million years.


Hi Steve,

you're welcome. I'm just glad I've finally understood enough to offer
helpful answers :-) (Though note the self-correction at the end of
this post.)
But it leads me to ask what is the use of something being in the
gloabl namespace if it cant be accessed globally?
I think that your question shows there is some residual confusion.
Things in the global namespace can be accessed just fine. The issue
with your code was that, while you had a global name currentAbility in
the global namespace sitting around just waiting to be accessed, your
first use of that name in your function was to assign it.

Assignments are by default to names in the local namespace. If you'd
put the global line in, you'd have told the interpreter to make the
assignment in the global scope. Without this, your function told the
interpreter to create a new name in the local namespace and make it
refer to the object to the right of the '=' which, in your case, was
not well-defined.

There is a certain logic to making assignments be assignments within
the active namepace by default. There may be a deeper reason, but I
don't know it. (To anyone more expert: if there is, I'd love to learn it).
I also find the continual need for objects to reference their own
variables by prefixing 'self' annoying. It seems that Python is the
reverse of my assuptions. whats the rationale for that?


The self prefix is just a conventional way of indicating a reference
to the current class instance. I hated it at first too. Python is my
first language since some BASIC long ago and the selfs were one reason
I steered clear of OOP at first. But, a few evenings of programming
with classes (a recent thing for me) and the aversion went away. So:
give it a bit of time; you might get so you aren't bothered by them.

I should also note there was some residual confusion in what I wrote, too:
Still another (but one not so good for clarity or beauty) would be to
put a line like:
temp = currentAbility # temp a name to reference global scope name
# before assignment to follow.
This won't work. Witness:
a = 42
def my_mistake(): .... temp = a
.... a = a * 2
.... my_mistake() Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "<interactive input>", line 2, in my_mistake
UnboundLocalError: local variable 'a' referenced before assignment


Sorry 'bout that :-[

Best,

Brian vdB

Jul 18 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
6994
by: srijit | last post by:
Hello, Any idea - why the following code crashes on my Win 98 machine with Python 2.3? Everytime I run this code, I have to reboot my machine. I also have Win32all-157 installed. from Tkinter...
3
2224
by: phil | last post by:
Using Tkinter Canvas to teach High School Geometry with A LOT of success. My drawing gets very slow after a lot of actions. For instance I have created code to rotate a set of objects about a...
2
4064
by: Stewart Midwinter | last post by:
this has me puzzled; I've created a small test app to show the problem I'm having. I want to use subprocess to execute system commands from inside a Tkinter app running under Cygwin. When I...
1
2213
by: John Chambers | last post by:
Sp my latest adventure is attempting to use python's Tkinter module on a few machines. On my PB (OSX 10.3.9), I got the following confusing results: /Users/jc: python Python 2.3 (#1, Sep 13...
1
3585
by: Michael Yanowitz | last post by:
Hello: Below I have included a stripped down version of the GUI I am working on. It contains 2 dialog boxes - one main and one settings. It has the following problems, probably all related, that...
13
3331
by: Daniel Fetchinson | last post by:
Was looking at PEP 3108, http://www.python.org/dev/peps/pep-3108/ , Is it just me or others also think that it would be a major loss to remove tkinter from the python core? PEP 3108 starts off...
8
3266
by: karthikbalaguru | last post by:
Hi, One of my python program needs tkinter to be installed to run successfully. I am using Redhat 9.0 and hence tried installing by copying the tkinter-2.2.2-36.i386.rpm alone from the CD 3 to...
2
2143
by: Dudeja, Rajat | last post by:
Hi, So, now I've finally started using Eclipse and PyDev as an IDE for my GUI Application. I just wrote some sample programs as an hands on. Now I would like to take up Tkinter. I'm using...
3
3901
by: J-Burns | last post by:
Hello. Im a bit new to using Tkinter and im not a real pro in programming itself... :P. Need some help here. Problem 1: How do I make something appear on 2 separate windows using Tkinter? By...
0
7237
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7137
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
1
7073
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
7506
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
4732
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
3218
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
3207
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
1571
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
0
443
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.