namespaces, scoping and variables

Chris Hare chare at labr.net
Mon Aug 2 15:33:25 EDT 2010


I am having a problem getting around this variable namespace thing.

Consider these code bits

File a.py
from Tkinter import *
import a1

def doAgain():
	x = a1.Net()
	x.show("Again!")

root = Tk()
root.title("test")
f = Frame(root,bg="Yellow")
l = Button(root,text="window 1",command=doAgain)
f.grid()
l.grid()
a = 5
x = a1.Net()
x.show("window 2")
if __name__ == "__main__":
	root.mainloop()

File a1.py
from Tkinter import *

class Net:
	def __init__(self):
		self.window = Toplevel()
	def show(self,t):		
		self.l = Label(self.window,text=t)
		self.l.grid()
                button = Button(self.window, text="Again")
		button.bind("<Button-1>", self.Again)
                button2 = Button(self.window, text="Dismiss")
		button2.bind("<Button-1>", self.hide)
		button.grid()
		button2.grid()
	def Again(self,event):
		x = Net()
		x.show(a)
	def hide(self,event):
		self.window.destroy()


When I run a.py, it imports a1.py and click on the Again button, I get the error

Exception in Tkinter callback
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk/Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "/Volumes/Development/py/a1.py", line 17, in Again
    x.show(a)
NameError: global name 'a' is not defined

I believe this is the expected behavior.  so my question is this -- how do I tell the code in a1.py about the variable a, which exists in a.py?  Do I have to pass it as part of the function call, or what?  using

global a

in a1.py doesn't change anything.

since I am using SQLite for the disk database, I was thinking I could keep all the "global" variables in an in memory database and just access them when I need to, but other ideas are welcome.

Thanks,
Chris




More information about the Python-list mailing list