You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:10:26