У меня есть следующая программа, использующая Tkinter в Python. он хорошо работает в простом формате, но выдает ошибки, когда я пытаюсь преобразовать его в классовый подход. Я отслеживаю предыдущий сеанс Tkinter GUI, сохраняя введенные значения в текстовом файле и создавая обработчик для отслеживания конца сеанса. Когда открывается новый сеанс, значение записи из предыдущего сеанса уже отображается в поле ввода
#!usr/bin/env python
from Tkinter import *
# Define input retrieve function for application input
def retrieve_text():
print(app_entry.get())
def handler():
f = open("backup.txt", "w")
f.write(app_entry.get())
f.close()
app_win.destroy()
if __name__ == "__main__":
# Create window (or form)
app_win = Tk()
# Create label
app_label = Label(app_win, text="Enter value")
app_label.pack()
# Create entry box
t = open("backup.txt")
var1 = t.readlines()
Text = StringVar()
Text.set(var1[0])
app_entry = Entry(app_win,textvariable=Text)
app_entry.pack()
# Create button
app_button = Button(app_win, text="Print Value", command=app_win.retrieve_text)
app_button.pack()
app_win.protocol("WM_DELETE_WINDOW", handler)
# Initialize GUI loop
app_win.mainloop()
Когда я пытаюсь перейти к подходу на основе классов, я получаю сообщение об ошибке «Экземпляр MyGUI не имеет атрибута с именем protocol». Моя классовая структура выглядит следующим образом:
#!usr/bin/env python
from Tkinter import *
class Tracker(Frame):
def __init__(self):
Frame.__init__(self)
# Create label
app_label = Label(self, text="Enter value")
app_label.pack()
# Create entry box
t = open("backup.txt")
var1 = t.readlines()
Text = StringVar()
Text.set(var1[0])
app_entry = Entry(self,textvariable=Text)
app_entry.pack()
# Create button
app_button = Button(self, text="Print Value", command=self.retrieve_text)
app_button.pack()
self.entry1 = app_entry.get()
self.protocol("WM_DELETE_WINDOW", self.handler)
def retrieve_text():
print(self.entry1)
def handler():
f = open("backup.txt", "w")
f.write(self.entry1)
f.close()
self.destroy()
if __name__ == "__main__":
# Create window (or form)
app = Tracker()
# Initialize GUI loop
app.mainloop()
Может ли кто-нибудь сказать мне, что я делаю не так? Правильно ли указано местоположение, в котором я указываю "WM_DELETE_WINDOW"?