在 Python 中使用 Tkinter 退出时的消息框对话框
Message Box Dialog at Exit using Tkinter in Python
我想在按下“X”按钮关闭 GUI 时显示一个消息框对话框。我想问用户是否确定他想用 Yes/No 选择退出程序。当我在对话框中按“是”时出现错误,如果我按“否”则 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
方法绑定window删除功能
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
模块的文档
Functions thus registered are automatically executed upon normal interpreter termination.
注册的函数在mainloop
被销毁后被调用(因为没有任何进展,它标志着程序的结束)。该函数试图破坏的 GUI 元素不再存在,错误也指出了这一点。
此模块不适用于您尝试实现的用例,它通常用于程序终止后应该执行任务的“清理”功能。
通过 WM_DELETE_WINDOW
协议注册的回调让您可以控制 window 被指示关闭时发生的事情。
只是添加到@AST 的回答:
您正在尝试使用 atexit
库来阻止在程序尝试退出时关闭 tkinter window。问题是 atexit
库在 window 被销毁后调用了你的函数。我什至不认为您可以使用 atexit
阻止您的程序退出。这就是为什么@AST 建议使用 root.protocol("WM_DELETE_WINDOW", on_close)
,它在 tkinter window 试图关闭时运行(仅当用户按下“X”按钮时才有效)。
我想在按下“X”按钮关闭 GUI 时显示一个消息框对话框。我想问用户是否确定他想用 Yes/No 选择退出程序。当我在对话框中按“是”时出现错误,如果我按“否”则 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
方法绑定window删除功能
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
模块的文档
Functions thus registered are automatically executed upon normal interpreter termination.
注册的函数在mainloop
被销毁后被调用(因为没有任何进展,它标志着程序的结束)。该函数试图破坏的 GUI 元素不再存在,错误也指出了这一点。
此模块不适用于您尝试实现的用例,它通常用于程序终止后应该执行任务的“清理”功能。
通过 WM_DELETE_WINDOW
协议注册的回调让您可以控制 window 被指示关闭时发生的事情。
只是添加到@AST 的回答:
您正在尝试使用 atexit
库来阻止在程序尝试退出时关闭 tkinter window。问题是 atexit
库在 window 被销毁后调用了你的函数。我什至不认为您可以使用 atexit
阻止您的程序退出。这就是为什么@AST 建议使用 root.protocol("WM_DELETE_WINDOW", on_close)
,它在 tkinter window 试图关闭时运行(仅当用户按下“X”按钮时才有效)。