覆盖Tkinter“X”按钮控件(关闭窗口的按钮)

时间:2010-07-20 23:46:28

标签: python button tkinter

当用户按下我创建的 close Button时,某些任务会在退出之前执行。但是,如果用户单击窗口右上角的[X]按钮关闭窗口,则无法执行这些任务。

如何覆盖用户点击[X]按钮时发生的情况?

4 个答案:

答案 0 :(得分:41)

听起来好像你的保存窗口应该是modal

如果这是一个基本的保存窗口,为什么要重新发明轮子? Tk为此目的有一个tkFileDialog


如果你想要的是覆盖破坏窗口的默认行为,你可以简单地做:

root.protocol('WM_DELETE_WINDOW', doSomething)  # root is your root window

def doSomething():
    # check if saving
    # if not:
    root.destroy()

这样,当有人关闭窗口时(无论如何),您可以截取destroy()来电并做你喜欢的事。

答案 1 :(得分:6)

使用方法procotol,我们可以通过将WM_DELETE_WINDOW协议与函数调用相关联来重新定义on_exit协议,在这种情况下,函数被称为import tkinter as tk from tkinter import messagebox class App(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.title("Handling WM_DELETE_WINDOW protocol") self.geometry("500x300+500+200") self.make_topmost() self.protocol("WM_DELETE_WINDOW", self.on_exit) def on_exit(self): """When you click to exit, this function is called""" if messagebox.askyesno("Exit", "Do you want to quit the application?"): self.destroy() def center(self): """Centers this Tk window""" self.eval('tk::PlaceWindow %s center' % app.winfo_pathname(app.winfo_id())) def make_topmost(self): """Makes this window the topmost window""" self.lift() self.attributes("-topmost", 1) self.attributes("-topmost", 0) if __name__ == '__main__': App().mainloop()

{{1}}

答案 2 :(得分:2)

您要查找的命令是wm_protocol,并将"WM_DELETE_WINDOW"作为要绑定的协议。它允许您定义窗口管理器关闭窗口时调用的过程(单击[x]时会发生这种情况)。

答案 3 :(得分:1)

我找到了关于Tkinter here的参考资料。它并不完美,但几乎涵盖了我所需要的一切。我认为第30.3节(事件类型)有帮助,它告诉我们小部件有一个“销毁”事件。我想.bind()将你的保存工作添加到主窗口的那个事件应该可以解决问题。

你也可以调用mainwindow.overrideredirect(True)(第24节),它通过标题栏中的按钮禁用最小化,调整大小和关闭。