Defining python global variable in sub function -


i have tkinter gui opens separate gui checkboxes. in separate window, need reference states of checkboxes, following error:

exception in tkinter callback traceback (most recent call last):   file "c:\python27\lib\lib-tk\tkinter.py", line 1470, in __call__     return self.func(*args)   file "c:\@ batch\lms python script\tester3.pyw", line 23, in var_states     print("fx: %d, fy: %d, fz: %d, mx: %d, my: %d, mz: %d" % (fx_1.get(), fy_1.get(), fz_1.get(),mx_1.get(), my_1.get(), mz_1.get())) nameerror: global name 'fx_1' not defined 

is possible define , reference global variable sub function?

here code:

from tkinter import * import tkinter import tempfile  root = tkinter.tk() root.title("generate apdl") root.geometry("200x225")  lbl1 = label(root, text="how many interface points?") lbl1.pack(side=top,padx=5,pady=5) entry1 = entry(root, bd =1) entry1.pack(side=top,padx=5,pady=5)  def newwindow():      ipoints=int(entry1.get())     numpoints=ipoints+1      master = tkinter.toplevel()     master.title("select unit load components")      def var_states():         print("fx: %d, fy: %d, fz: %d, mx: %d, my: %d, mz: %d" % (fx_1.get(), fy_1.get(), fz_1.get(),mx_1.get(), my_1.get(), mz_1.get()))      def closewindow():         master.destroy()      in xrange(1,numpoints):          label(master, text="pt_%d: " % i).grid(row=i,column=0, sticky=w)         exec('global fx_' + str(i)) in globals(), locals()         checkbutton(master, text="fx", variable='fx_%d' % i).grid(row=i,column=2, sticky=w)         exec('global fy_' + str(i)) in globals(), locals()         checkbutton(master, text="fy", variable='fy_%d' % i).grid(row=i,column=3, sticky=w)         exec('global fz_' + str(i)) in globals(), locals()         checkbutton(master, text="fz", variable='fz_%d' % i).grid(row=i,column=4, sticky=w)         exec('global mx_' + str(i)) in globals(), locals()         checkbutton(master, text="mx", variable='mx_%d' % i).grid(row=i,column=5, sticky=w)         exec('global my_' + str(i)) in globals(), locals()         checkbutton(master, text="my", variable='my_%d' % i).grid(row=i,column=6, sticky=w)         exec('global mz_' + str(i)) in globals(), locals()         checkbutton(master, text="mz", variable='mz_%d' % i).grid(row=i,column=7, sticky=w)       label(master, text=" ").grid(row=99,column=0, sticky=w)     bttn1=button(master, text='generate apdl snippet', command=var_states).grid(row=100,column=0, sticky=w)     label(master, text=" ").grid(row=101,column=0, sticky=w)     bttn2=button(master, text='close window', command=closewindow)     bttn2.grid(row=102,column=0, sticky=w)  bttn1 = tkinter.button(root, text ="open new window", command = newwindow) bttn1.pack(side = top,padx=10,pady=5)  root.mainloop() 

this little hack you're trying pull global i've never seen before -- kudos originality :-), wouldn't suggest keep going down road because it's going major pain work (if it's possible) , in long-run maintenance more painful.

never fear though. there is better way! in these circumstances, recommend using class. class, can carry of state need along self. here's abbreviated version of code:

class newwindowfactory(object):     def var_states(self):         print 'fx_1', self.fx_1.get()     def newwindow(self):         in xrange(1,numpoints):             label = label(master, text="pt_%d: " % i)             label.grid(row=i,column=0, sticky=w)             setattr(self, 'fx_' + str(i), label)         button(master, text='generate apdl snippet', command=self.var_states).grid(row=100,column=0, sticky=w) 

usage this:

factory = newwindowfactory() bttn1 = tkinter.button(root, text="open new window", command = factory.newwindow) bttn1.pack(side = top,padx=10,pady=5) 

also note whenever have series of variables foo1, foo2, foo3 ..., want start thinking using different data structure (in case, want list of checkboxes rather 10 checkbox variables). more in-depth explanation, see keep data out of variable names, execellent article ned batchelder.

an astute reader might notice there benefits gained turning entire application class (you can set initial ui in __init__). recommend approach, didn't write out keep suggestion simple possible.


Comments

Popular posts from this blog

Android : Making Listview full screen -

javascript - Parse JSON from the body of the POST -

javascript - Chrome Extension: Interacting with iframe embedded within popup -