我有一个包含tkinter窗口和其他正在运行的任务的 python 代码。
我一直在尝试将"WM_DELETE_WINDOW"事件绑定到一个函数,该函数在关闭窗口时退出我的 python 代码,但无法实现。
这是我的尝试:
def on_exit():
root.destroy()
sys.exit()
root.protocol('WM_DELETE_WINDOW', on_exit)
Run Code Online (Sandbox Code Playgroud)
窗口被成功销毁但python代码没有退出。有什么sys.exit()不工作的可能原因吗?
我究竟做错了什么?我应该尝试任何替代方法吗?
做了一些测试,我想出了可能是什么问题。
这是一个小代码,它总结了我的大得多的代码。
import tkinter as tk
import sys
root = tk.Tk()
submitted = tk.IntVar()
def on_exit():
root.destroy()
sys.exit()
root.protocol('WM_DELETE_WINDOW', on_exit)
def submit():
submitted.set(1)
print("submitted")
button= tk.Button(root, text="Submit",command=submit)
button.pack()
button.wait_variable(submitted)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我现在相信这wait_variable是问题的根源。
当我添加submitted.set(1)到on_exit()(或者如果我在关闭窗口之前先单击按钮)时,代码实际上会退出,但是如果我尝试在不按下按钮的情况下关闭窗口,代码将不会退出。
那么这是否意味着wait_variable不仅让 tkinter 应用程序等待,而且还阻止了 python 代码退出?!
我试过了os._exit(1),它奏效了,但我认为它不干净。