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

Reply via email to