【问题标题】:Message Box Dialog at Exit using Tkinter in Python在 Python 中使用 Tkinter 退出时的消息框对话框
【发布时间】:2021-03-04 19:45:20
【问题描述】:

我想在按下“X”按钮关闭 GUI 时显示一个消息框对话框。我想问用户他是否确定他想用是/否选择退出程序。在对话框中按“是”时出现错误,如果按“否”则 GUI 关闭。 This is the full code

这是我得到的错误:

self.tk.call('destroy', self._w)

_tkinter.TclError:无法调用“destroy”命令:应用程序已被销毁

这是我到目前为止所做的:

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)

【问题讨论】:

  • 您遇到的错误是什么?你能给我们完整的追溯吗?如果我不得不猜测,那就是 root 没有定义。
  • 请贴出完整代码和错误代码。
  • 我发布了完整的代码和我遇到的错误,谢谢!
  • 基本上它告诉你那个窗口已经关闭了。您无法关闭已关闭的窗口。在调用该函数之前,您的一段代码会破坏窗口。

标签: python user-interface tkinter messagebox


【解决方案1】:

您可以使用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 协议注册的回调使您可以控制窗口被指示关闭时发生的情况。

【讨论】:

  • 下次请解释为什么 OP 的方法不起作用。正确答案仍然 +1
  • @TheLizzard 糟糕,我完全忘记了,您似乎已经这样做了,谢谢。为了完整起见,我已经用解释更新了我的答案。
【解决方案2】:

只是添加到@AST 的答案:

当程序试图退出时,您正在尝试使用 atexit 库来阻止关闭 tkinter 窗口。问题是atexit 库在窗口被销毁后调用您的函数。我什至不认为您可以使用atexit 阻止您的程序退出。这就是为什么@AST 建议使用root.protocol("WM_DELETE_WINDOW", on_close),它在 tkinter 窗口试图关闭时运行(仅在用户按下“X”按钮时有效)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2017-08-19
    • 2021-08-04
    相关资源
    最近更新 更多