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

Tkinter调用grid_remove()后父容器无法自动调整尺寸的问题咨询及优化方案探讨

Tkinter调用grid_remove()后父容器无法自动调整尺寸的问题咨询及优化方案探讨

我最近在捣鼓Tkinter的时候遇到个困惑,要么是我看错了文档,要么就是对Tkinter的某些概念还没摸透😅

  • 当我用grid()把组件(比如Label)添加到Frame里时,Frame会自动调整尺寸来适配这些组件,这部分和我预期的一样。
  • 可当我用frame.winfo_children()选中所有子组件,再调用grid_remove()把它们都隐藏后,Frame却不会自动缩小回原来的大小,这和我想要的结果不一样。

我还发现了一个更奇怪的现象,按下面的步骤操作:

  1. 给Frame添加20个组件
  2. 调用grid_remove()把所有组件都隐藏
  3. 再添加10个组件

结果却是:

  1. Frame会调整尺寸适配20个组件的大小
  2. 移除所有组件后,Frame尺寸不变
  3. 新增10个组件后,Frame居然又缩小到适配这10个组件的大小?

这到底是为什么啊🤔


补充说明

我现在在做一个功能:点击ttk.LabelFrame的标题,就能展开或折叠这个LabelFrame——本质就是隐藏/显示它的子组件,同时希望后续调用.grid()的时候不用额外加参数。目前我的实现思路可能不太高效,欢迎大家给我提改进建议!

我试过几种方法,但都有点问题:

  • 有朋友建议先把Frame尺寸缩到1再改成0,但这个方法在我的LabelFrame场景里不管用,因为LabelFrame的标题会直接消失,不过这个思路我还是挺认可的。
  • 另一种方法能满足当前的限制,但如果在折叠状态下往LabelFrame里加组件,效果会很丑。
  • 我还试过之前看到的一个方法,绑定<Expose>事件,但结果直接触发了无限循环,坑惨我了😂

复现代码

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

app = ttk.Frame(root)
app.grid(row=0, column=0, columnspan=2, sticky=tk.NW+tk.SE)

def add(start=None):
    start = start or len(app.winfo_children())
    for i in range(start,start+10):
        ttk.Label(app, text=f"{i}").grid(row=i, column=0, sticky=tk.NW+tk.SE)

def rem():
    for _f in app.grid_slaves():
        _f.grid_remove()

ttk.Button(root, text='+', command=add).grid(row=1, column=0)
ttk.Button(root, text='-', command=rem).grid(row=1, column=1)

root.mainloop()

备注:内容来源于stack exchange,提问作者R4PH43L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:49:35