namespaces, scoping and variables
MRAB
python at mrabarnett.plus.com
Mon Aug 2 16:03:18 EDT 2010
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.
>
Why in a database? If you need the modules to share it then you could
put it in a shared module and refer to it there:
File a.py
---------
import my_globals
...
my_globals.a = 5
File a1.py
----------
import my_globals
...
x.show(my_globals.a)
More information about the Python-list
mailing list