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( )
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.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.