在destroy()tkinter

时间:2018-09-25 15:13:59

标签: python class events tkinter window

我第一次使用tkinter,并且创建了一个窗口,该窗口具有一个列表框,其中包含用户可以选择的值。这些值将传递到函数中,并且任何控制台输出都将显示在窗口的文本框中。

这是我的代码:

class Display(tk.Frame):
    def __init__(self,parent=0):
       tk.Frame.__init__(self,parent)

       # code here that creates a bunch of widgets

       sys.stdout = self

       # code here that packs widgets into frame

    def onSubmit(self):
        self.years = list()
        self.selection = self.lstbox.curselection()
        for i in self.selection:
            entry = self.lstbox.get(i)
            self.years.append(int(entry))
        batch_process(self.years)

    def write(self, txt):
        self.output.insert(tk.END,str(txt))
        self.output.see(tk.END)
        self.update_idletasks()  


class MainW(tk.Tk):
    def __init__(self, parent):
        tk.Tk.__init__(self ,parent)
        self.parent = parent
        self.display = Display(self)
        self.display.pack()
        self.title('Test')

        self.protocol('WM_DELETE_WINDOW', self.close_window)

    def close_window(self):
        if messagebox.askokcancel('Exit', 'Are you sure you want to close?'):
            self.destroy()

if __name__=='__main__':
    window = MainW(None)
    window.mainloop()

窗口运行良好-列表框成功将值传递到函数中,输出显示在文本框中。

但是,当我单击“ X”并关闭窗口时,控制台显示脚本由于某种原因仍在运行。然后,我必须完全关闭Spyder才能再次运行脚本。怎么了我的理解是destroy()将终止主循环。

编辑:如果其他人运行了脚本并出现以下错误:

Exception ignored in: <__main__.Display object .!display> 
AttributeError: 'Display' object has no attribute 'flush'

1 个答案:

答案 0 :(得分:0)

我明白了...即使我不太了解。我必须在“显示”类中添加“刷新”功能。

def flush(self): 
    pass