Tkinter关闭子窗口后残留无响应命令行窗口问题求助
问题分析与解决
问题根源
点击子窗口右上角关闭按钮时,wait_variable(ivStopWaiting)会一直阻塞函数执行——这个方法在等待ivStopWaiting变量被修改,但关闭窗口的操作并没有触发变量变化,导致函数卡在这一步,无法执行后续的窗口销毁逻辑,最终造成命令行窗口无响应。
修复方案
给子窗口绑定关闭事件,在窗口关闭时主动设置ivStopWaiting变量,让wait_variable结束阻塞,从而正常走完后续流程。同时注意,sub_win.quit()是多余的,destroy()已经足够销毁子窗口,且quit()可能干扰主循环。
修复后的代码:
import tkinter as tk from tkinter import * def startSubWin(): sub_win = Toplevel(root) sub_win.title("Sub Window") ivStopWaiting = IntVar() # 绑定窗口关闭事件,设置变量结束等待 def on_sub_close(): ivStopWaiting.set(1) sub_win.destroy() sub_win.protocol("WM_DELETE_WINDOW", on_sub_close) btnQuit = Button(sub_win, text="Quit", command=lambda: ivStopWaiting.set(1)) btnQuit.pack(side=tk.LEFT, padx=10) btnQuit.wait_variable(ivStopWaiting) sub_win.destroy() root = tk.Tk() root.title('Main Window') btnAddOtherTLR = Button(root, text='Sub Window', command=startSubWin) btnAddOtherTLR.pack(side=tk.LEFT, padx=10) root.mainloop()
额外说明
- 使用
protocol("WM_DELETE_WINDOW", on_sub_close)可以捕获窗口右上角的关闭事件,自定义处理逻辑 - 移除了多余的
sub_win.quit(),因为子窗口的quit()会终止主事件循环,可能导致主窗口也被关闭,而我们只需要销毁子窗口即可
内容的提问来源于stack exchange,提问作者Trevor Boardman
相关产品推荐
相关产品推荐

