出现此错误的主要原因是当您第一次销毁包含文本小部件的容器时注销。即使小部件(框架)存在于全局名称空间中,但您已经销毁了它被分配到的tkinter实例。因此不能再适用于它。
这是重建的直接结果
Tk()
实例,而不是只使用一个实例并管理其中的数据。
我的示例将把您的代码浓缩为更简单的内容,并为您提供一个良好的起点。我们将在这里为文本框中的文本创建一个全局跟踪变量。这将允许我们在注销时保存数据,然后在重新登录时重新应用数据。从而保留了旧的文本。
import tkinter as tk
def Home():
clear_widgets()
tk.Button(root, text='Enter Grades', bg='blue', fg='white', command=enterG).grid(row=0, column=0, sticky="w")
tk.Button(root, text='LogOut', bg='brown', fg='white', command=logout).grid(row=0, column=1, sticky="e")
def enterG():
global txt
if txt == None:
txt = tk.Text(root, width=64, height=10)
txt.grid(row=1, column=0, columnspan=2, sticky="ns")
txt.insert(1.0, text_data)
def logout():
global txt, text_data
text_data = txt.get(1.0, "end-1c")
clear_widgets()
txt = None
tk.Button(root, text='Login', bg='blue', fg='white', command=login).grid(row=0, column=0)
def clear_widgets():
for widget in root.winfo_children():
widget.destroy()
def login():
# some method of checking login credentials.
Home()
root = tk.Tk()
text_data = ""
tk.Button(root, text='Login', bg='blue', fg='white', command=login).grid(row=0, column=0)
root.mainloop()
下面是一个代码的类示例。
import tkinter as tk
class Example(tk.Tk):
def __init__(self):
super().__init__()
self.text_data = ""
self.txt = None
tk.Button(self, text='Login', bg='blue', fg='white', command=self.login).grid(row=0, column=0)
def home(self):
self.clear_widgets()
tk.Button(self, text='Enter Grades', bg='blue', fg='white', command=self.enter_g).grid(row=0, column=0, sticky="w")
tk.Button(self, text='LogOut', bg='brown', fg='white', command=self.logout).grid(row=0, column=1, sticky="e")
def enter_g(self):
if self.txt == None:
self.txt = tk.Text(self, width=64, height=10)
self.txt.grid(row=1, column=0, columnspan=2, sticky="ns")
self.txt.insert(1.0, self.text_data)
def logout(self):
self.text_data = self.txt.get(1.0, "end-1c")
self.clear_widgets()
self.txt = None
tk.Button(self, text='Login', bg='blue', fg='white', command=self.login).grid(row=0, column=0)
def clear_widgets(self):
for widget in self.winfo_children():
widget.destroy()
def login(self):
# some method of checking login credentials.
self.home()
Example().mainloop()