将类结构与Python协议一起使用删除窗口处理程序
我有以下程序使用Python中的Tkinter。它在其简单的格式中工作得很好,但当我尝试将其转换为类方法时,它会给我带来错误。我正在跟踪以前的Tkinter GUI会话,方法是将输入的值存储在文本文件中,并创建一个处理程序来跟踪会话的结束。打开新会话时,上一会话的输入值已显示在输入框中将类结构与Python协议一起使用删除窗口处理程序,python,tkinter,protocols,handler,Python,Tkinter,Protocols,Handler,我有以下程序使用Python中的Tkinter。它在其简单的格式中工作得很好,但当我尝试将其转换为类方法时,它会给我带来错误。我正在跟踪以前的Tkinter GUI会话,方法是将输入的值存储在文本文件中,并创建一个处理程序来跟踪会话的结束。打开新会话时,上一会话的输入值已显示在输入框中 #!usr/bin/env python from Tkinter import * # Define input retrieve function for application input def ret
#!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”的位置正确吗?当您向我们展示原始的、有效的代码而不是非有效的基于类的代码时,我想我们很难告诉您基于类的方法有什么问题 也就是说,我可以回答“我在哪里初始化'WM_DELETE_WINDOW'命令?”。您可以在应用程序对象的构造函数中初始化它
class MyApp(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
...
self.protocol("WM_DELETE_WINDOW", self.handler)
你的跟踪器类是一个框架
self.protocol(“WM_DELETE_WINDOW”,self.handler)#用于顶级或根窗口。对此表示抱歉。我更新的问题显示了我一直在尝试什么。