2012-02-21 30 views
0

我有以下程序在Python中使用Tkinter。它以其简单的格式运行良好,但当我尝试将其转换为类方法时会出现错误。我正在跟踪以前的Tkinter GUI会话,将输入的值存储在文本文件中,并创建一个处理程序来跟踪会话的结束。当一个新的会话被打开,从以前会议的入账价值已经显示在输入框中使用类结构与Python协议删除窗口处理程序

#!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实例没有属性命名协议“。我的阶级结构如下:

#!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”的位置是否正确?

回答

1

您的跟踪器类是一个框架。

self.protocol(“WM_DELETE_WINDOW”,self.handler)#旨在用于Toplevel或根窗口。

1

我想我们很难告诉你,当你向我们展示原始的工作代码而不是非工作的基于类的代码时,你的基于类的方法出了什么问题。这就是说,我可以回答“我到底在什么地方初始化'WM_DELETE_WINDOW'命令?”。您在应用程序对象的构造函数中初始化它。

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

对不起。我更新的问题显示了我一直在尝试的内容。 – prrao 2012-02-21 18:09:00