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
Post a Comment