tkinter按键触发销毁子Frame后容器框架残留问题咨询
问题原因分析
1. 两种销毁方式的执行时机差异
你注释的两行同步销毁代码,是在Tkinter主事件循环(即app.mainloop(),你代码里省略了这行标准启动代码)启动之前运行的。此时Tkinter还没有完成第一次窗口布局计算和渲染,两个子Frame销毁后,container内部没有任何子部件,pack几何管理器第一次计算尺寸时就会直接将container的大小设为0,自然不会出现黄色残留。
2. 逐次按键销毁的布局逻辑问题
按键触发的销毁操作是在主事件循环运行过程中执行的,此时窗口已经完成了至少一次渲染:
- 第一次按键后,你销毁了第二个子Frame,
container内还剩1个3030的红色Frame,pack重新计算后将container尺寸更新为3030,并且同步完成了窗口重绘。 - 第二次按键后,最后一个子Frame被销毁,此时
container内部没有任何子部件,按pack的默认自动收缩规则本应该将container缩到0尺寸,但Tkinter的布局系统对于已经渲染过的容器,在所有子部件清空后不会主动触发强制重绘收缩,导致container保留了最后一次的30*30的尺寸,就出现了你看到的黄色残留方块。
可选修复方案
如果要避免残留,可在销毁逻辑后添加强制布局更新代码:
def on_key_press(event): if children: children[-1].destroy() del children[-1] # 强制触发container的布局重算 container.update_idletasks()
内容的提问来源于stack exchange,提问作者Gradient
相关产品推荐
相关产品推荐

