【发布时间】:2019-05-28 16:46:27
【问题描述】:
我的主代码包含多个函数,我对其进行了测试,它运行良好。然后我为tkinter 窗口创建一个类,并单独对其进行测试,它也可以正常工作。当我将它们合并在一起时,通过在函数中创建一个类对象,我收到以下错误消息:
"TclError: can't invoke "frame" command: application has been destroyed"
import tkinter
class InputFromForm():
def __init__(self, root, values):
self.field = []
self.fieldStrings = values
self.temp = self.makeform(self.fieldStrings)
def makeform(self, fields):
entries = []
for i in fields:
row = tkinter.Frame(root)
lab = tkinter.Label(row, width=15, text=i, anchor='w')
ent = tkinter.Entry(row)
ent.insert(tkinter.END, fields[i])
ent.bind("<FocusIn>", lambda event, e=ent: e.selection_range(0, tkinter.END))
row.pack(side=tkinter.TOP, fill=tkinter.X, padx=5, pady=10)
lab.pack(side=tkinter.LEFT)
ent.pack(side=tkinter.RIGHT, expand=tkinter.YES, fill=tkinter.X)
entries.append((i, ent))
return entries
def fetch(self, entries):
for entry in entries:
string = entry[0]
text = entry[1].get()
self.field.append(text)
return self.field
def close(self, root):
root.destroy()
def extractData(dOfValues):
root = tkinter.Tk()
root.title('Test')
userInput = InputFromForm(root, dOfValues)
root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
b1 = tkinter.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
b1.config(width=25)
b1.pack(anchor=tkinter.CENTER, padx=5, pady=20)
root.mainloop()
if __name__ == '__main__':
dOfValues = {'Customer No.': '',
'PO #':'020202',
'Order Date': '2/3/2012',
'Zip to code':'92182'}
#root = tkinter.Tk()
#root.title('Test')
#userInput = InputFromForm(root, dOfValues)
#root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
#b1 = tkinter.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
#b1.config(width=25)
#b1.pack(anchor=tkinter.CENTER, padx=5, pady=20)
#root.mainloop()
extractData(dOfValues) # Adding this, creates the error. If I put the code
# from this function into main, it works.
有人能解释一下是怎么回事吗?
【问题讨论】:
-
您似乎遇到了编码错误。你从来没有真正在你的课堂上保存根目录。你需要做
self.root = root。然后row = tkinter.Frame(self.root)。它真的应该只给你一个 NameError,但也许 Tkinter 有一些错误捕捉到,这会混淆错误。 -
这个错误是不言自明的。有一次你有一个根窗口,它被破坏了,现在你试图在一个不再存在的窗口中创建一个框架。
-
@Greg 我添加了你推荐的内容,我相信我的
close()方法应该是:self.root.destroy()。我遇到了另一个错误:"AttributeError: 'InputFromForm' object has no attribute 'root'". -
@BryanOakley 根窗口是如何被破坏的?我从来没有把它毁掉
-
你认为第 23 行中的
root.destroy()有什么作用?