tkinter WM_DELETE_WINDOW
时间: 2023-10-24 18:06:35 浏览: 66
tkinter中的WM_DELETE_WINDOW是一个窗口管理器协议,用于处理用户关闭窗口的事件。在使用WM_DELETE_WINDOW时,需要使用Tk对象的protocol方法将窗口管理器协议与回调函数关联起来。回调函数将在用户尝试关闭窗口时调用。
示例代码如下:
```
import tkinter as tk
def on_closing():
if messagebox.askokcancel("Quit", "Do you want to quit?"):
root.destroy()
root = tk.Tk()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
```
相关问题
WM_DELETE_WINDOW
WM_DELETE_WINDOW是Tkinter中的一个协议,用于定义当用户使用窗口管理器显式关闭窗口时的处理方式。
当窗口管理器接收到关闭窗口的命令时,Tkinter会自动销毁相应的窗口小部件实例层次结构,但从Python 1.5.2开始,Tkinter不会破坏这些窗口小部件实例,因此建议始终为顶级窗口注册一个处理程序,以确保窗口的正确销毁。
在Tkinter中,可以使用protocol方法来为WM_DELETE_WINDOW协议安装处理程序,例如:widget.protocol("WM_DELETE_WINDOW", handler)。这样,当用户关闭窗口时,会触发指定的处理程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [tkinter-protocol-创建销毁窗口](https://blog.csdn.net/weixin_39967072/article/details/109960087)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [Window 消息大全](https://download.csdn.net/download/yeungqi/1927605)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
Browse_Camera().Firing() File "D:/TCL_2.0/2.py", line 19, in __init__ self.root.protocol("WM_DELETE_WINDOW", release_components(self.root)) File "D:\python\python3.7\lib\tkinter\__init__.py", line 1965, in wm_protocol 'wm', 'protocol', self._w, name, command) _tkinter.TclError: can't invoke "wm" command: application has been destroyed
这个错误是因为你在销毁窗口后仍然尝试调用 `wm_protocol()` 方法。当窗口被销毁后,它的所有方法都无法再被调用。
要解决这个问题,你可以将 `release_components` 函数作为一个单独的函数,并将其绑定到 `WM_DELETE_WINDOW` 事件上。这样,当点击关闭窗口按钮时,`release_components` 函数将被调用。
下面是一个示例代码:
```python
import tkinter as tk
def release_components():
# 在这里执行释放组件的操作
print("Release components")
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()
# 捕获关闭窗口事件
root.protocol("WM_DELETE_WINDOW", release_components)
root.mainloop()
```
在这个示例中,我们将 `release_components` 函数作为一个单独的函数,并将其绑定到 `root.protocol("WM_DELETE_WINDOW", release_components)`。这样,当点击关闭窗口按钮时,`release_components` 函数将被调用。
希望这个解决方案能够帮助你解决问题!如果你还有其他问题,请随时提问。