使用Python协议的类结构删除窗口处理程序

时间:2012-02-21 04:45:55

标签: python tkinter protocols handler

我在Python中使用Tkinter有以下程序。它以简单的格式运行良好但在我尝试将其转换为类方法时给出了错误。我通过将输入的值存储在文本文件中并创建处理程序来跟踪会话结束来跟踪之前的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”的位置是否正确?

2 个答案:

答案 0 :(得分:1)

我认为,当您向我们展示原始的工作代码而非基于非工作类的代码时,我们很难告诉您基于类的方法有什么问题。

话虽这么说,我可以回答“我究竟在哪里初始化'WM_DELETE_WINDOW'命令?”。您可以在应用程序对象的构造函数中初始化它。

class MyApp(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        ...
        self.protocol("WM_DELETE_WINDOW", self.handler)

答案 1 :(得分:1)

您的Tracker类是一个框架。

self.protocol(“WM_DELETE_WINDOW”,self.handler)#用于与Toplevel或根窗口一起使用。