Reputation: 3437
When I hit the button in this script I get an error saying
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
File "grid_layout.py", line 41, in printout
data = [ { l1.cget("text"): (e1.get(), e2.get()) } for e1,e2,l1 in zip(E1,E2,L1) ]
AttributeError: 'NoneType' object has no attribute 'get'
What am I doing wrong here?
from Tkinter import *
import json
root = Tk( )
E1 = []
E2 = []
E3 = []
L1 = []
Label(root, text="Way Point").grid(row=0, column=0)
Label(root, text="x").grid(row=0, column=1)
Label(root, text="y").grid(row=0, column=2)
Label(root, text="z").grid(row=0, column=3)
for r in range(1,10):
l1 = Label(root, text="Number%d" % (r),borderwidth=1).grid(row=r, column=0)
e1 = Entry(root, width=10).grid(row=r, column=1)
e2 = Entry(root, width=10).grid(row=r, column=2)
e3 = Entry(root, width=10).grid(row=r, column=3)
E1.append(e1)
E2.append(e2)
E3.append(e3)
L1.append(l1)
Label(root, text="zone").grid(row=11, column=0)
Label(root, text="x").grid(row=11, column=1)
Label(root, text="y").grid(row=11, column=2)
Label(root, text="z").grid(row=11, column=3)
for r in range(12,22):
l2 = Label(root, text="Number%d" % (r-11),borderwidth=1 ).grid(row=r, column=0)
e4 = Entry(root, width=10).grid(row=r, column=1)
e5 = Entry(root, width=10).grid(row=r, column=2)
e6 = Entry(root, width=10).grid(row=r, column=3)
def printout():
# Iterate over the zip of E & L (joined), building the dict using .cget('text') to get
# the value of the Tkinter label. Add the { 'c':3.0 } to the end of the resulting list
data = [ { l1.cget("text"): (e1.get(), e2.get()) } for e1,e2,l1 in zip(E1,E2,L1) ]
print json.dumps(data, sort_keys=True, indent=2)
with open('data.json', 'w') as outfile:
json.dump(data, outfile, sort_keys=True, indent=2)
plus = Button(root, text='Print', command=printout)
plus.grid(row=23, column=1)
root.mainloop( )
Upvotes: 0
Views: 140
Reputation: 69012
Look at this line:
e1 = Entry(root, width=10).grid(row=r, column=1)
In this case this does the same as:
e1 = Entry(root, width=10)
e1 = e1.grid(row=r, column=1)
e1.grid(...)
returns None, so you end up with e1 = None
. As you use this kind of assignment everywhere, your lists are filled with None
only, therefore when you later call ... e1.get() ...
on them, you get that error.
Try to separate creating the objects and calling methods on them.
Upvotes: 2