On 08/02/2010 09:33 PM, Chris Hare wrote: > 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.
"global" in Python isn't the same as "global" in C, or in PHP. "Global" is, in essence, a shorter way of saying "within the scope of this module" -- which keeps the "global" nice and clean. You should probably just pass in the object you call "a" when creating the object that uses it, or when calling the function/method when calling it. If you don't want to do that, you can simply import the module where your global data is stored -- beware of "from XYZ import ...", though - that copies the variables, and won't do you much good here. -- http://mail.python.org/mailman/listinfo/python-list