问题描述
我想在按下“X”按钮关闭 GUI 时显示一个消息框对话框。我想问用户他是否确定要以是/否选择退出程序。在对话框中按“是”时出现错误,如果按“否”,GUI 将关闭。 This is the full code
这是我得到的错误:
self.tk.call('destroy',self._w)
_tkinter.TclError:无法调用“销毁”命令:应用程序已被销毁
这是我目前所做的:
import atexit
def deleteme():
result = messageBox.askquestion("Exit","Are You Sure You Want to Exit?")
if result == "yes":
root.destroy()
else:
return None
atexit.register(deleteme)
解决方法
您可以使用protocol
方法将窗口删除与函数绑定。
from tkinter import *
from tkinter import messagebox
def on_close():
response=messagebox.askyesno('Exit','Are you sure you want to exit?')
if response:
root.destroy()
root=Tk()
root.protocol('WM_DELETE_WINDOW',on_close)
root.mainloop()
更新
根据atexit
模块的文档
这样注册的函数会在解释器正常终止时自动执行。
注册的函数是在 mainloop
销毁后调用的(因为没有任何进展,它标志着程序结束)。函数试图销毁的 GUI 元素不再存在,正如错误所述。
此模块不适用于您尝试实现的用例,它通常用于应该在程序终止后执行任务的“清理”功能。
通过 WM_DELETE_WINDOW
协议注册的回调使您可以控制窗口被指示关闭时发生的情况。
只是添加到@AST 的答案中:
当程序试图退出时,您正尝试使用 atexit
库来阻止关闭 tkinter 窗口。问题是 atexit
库在窗口销毁后调用您的函数。我什至不认为您可以使用 atexit
阻止程序退出。这就是为什么@AST 建议使用 root.protocol("WM_DELETE_WINDOW",on_close)
的原因,它在 tkinter 窗口尝试关闭时运行(仅在用户按下“X”按钮时才起作用)。