From: Chris Hare on
Thanks to everyone for answering my question. I think its clear now. I'll just go the "stuff 'em in a module and import that" route.

Chris

On Aug 2, 2010, at 3:03 PM, MRAB wrote:

> 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)
> --
> http://mail.python.org/mailman/listinfo/python-list

From: rantingrick on
On Aug 2, 3:12 pm, Chris Hare <ch...(a)labr.net> wrote:
> Thanks to everyone for answering my question.  I think its clear now.  I'll just go the "stuff 'em in a module and import that" route.

Chris, first of all i want you to know that this message is not meant
to offend but it may offend you -- hopefully your a rational person
and can deal with criticism.

This code is horrible. What are you trying to do exactly? Is this
purely academic or are you actually using this code for a real
purpose? The "Net" class looks like a dialog. Are you wishing to
create a dialog? If so, then you would be better off subclassing
tkSimpleDialog.Dialog instead of rolling your own. Please explain what
you are trying to do from a users perspective so we can properly guide
you.

Also you should use 4 space indention and never use tabs. This is the
accepted way. Although Python does allow freedom i would suggest that
coding in a uniformly accepted manner is more productive for the
entire community. Google "Python Style Guide" for more info.

Thanks
From: Jean-Michel Pichavant on
rantingrick wrote:
> On Aug 2, 3:12 pm, Chris Hare <ch...(a)labr.net> wrote:
>
> Also you should use 4 space indention and never use tabs. This is the
> accepted way.
Then ask yourself why tabs are still in python 3.
Nice troll by the way.

JM