Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 覆盖Tkinter“;X";按钮控件(关闭窗口的按钮)_Python_Button_Tkinter - Fatal编程技术网

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

Python 覆盖Tkinter“;X";按钮控件(关闭窗口的按钮),python,button,tkinter,Python,Button,Tkinter,当用户按下我创建的关闭按钮时,一些任务会在退出之前执行。但是,如果用户单击窗口右上角的[X]按钮关闭窗口,我将无法执行这些任务 当用户单击[X]按钮时,我如何覆盖所发生的事情?我在Tkinter上找到了一个参考。它并不完美,但几乎涵盖了我所需要的一切。我觉得第30.3节(事件类型)很有帮助,它告诉我们小部件有一个“销毁”事件。我想.bind()将保存作业绑定到主窗口的事件应该可以做到这一点 您还可以调用mainwindow.OverrideDirect(True)(第24节),它通过标题栏中的按

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


当用户单击
[X]
按钮时,我如何覆盖所发生的事情?

我在Tkinter上找到了一个参考。它并不完美,但几乎涵盖了我所需要的一切。我觉得第30.3节(事件类型)很有帮助,它告诉我们小部件有一个“销毁”事件。我想.bind()将保存作业绑定到主窗口的事件应该可以做到这一点


您还可以调用mainwindow.OverrideDirect(True)(第24节),它通过标题栏中的按钮禁用最小化、调整大小和关闭功能。

听起来您的保存窗口应该是

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


如果要覆盖破坏窗口的默认行为,只需执行以下操作:

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

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

这样,当有人(通过任何方式)关闭窗口时,您可以拦截
destroy()
调用并执行您喜欢的操作。

您要查找的命令是
wm\u protocol
,将其作为绑定的协议。它允许您定义在窗口管理器关闭窗口时调用的过程(这是单击
[x]
时发生的情况)

使用方法
procotol
,我们可以通过关联对函数的调用来重新定义
WM\u DELETE\u WINDOW
协议,在这种情况下,函数在退出时调用

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()
overrideredirect(flag=None)[#]设置或获取覆盖重定向标志。如果非零,这将阻止窗口管理器装饰窗口。换句话说,窗口将没有标题或边框,不能通过普通方式移动或关闭。