Основная причина, по которой вы получаете эту ошибку, заключается в том, что вы выходите из системы при первом уничтожении контейнера, содержащего текстовый виджет. Даже если виджет (фрейм) существует в глобальном пространстве имен, вы уничтожили экземпляр 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()