Tkinter调用grid_remove()后父容器无法自动调整尺寸的问题咨询及优化方案探讨
Tkinter调用grid_remove()后父容器无法自动调整尺寸的问题咨询及优化方案探讨
我最近在捣鼓Tkinter的时候遇到个困惑,要么是我看错了文档,要么就是对Tkinter的某些概念还没摸透😅
- 当我用
grid()把组件(比如Label)添加到Frame里时,Frame会自动调整尺寸来适配这些组件,这部分和我预期的一样。 - 可当我用
frame.winfo_children()选中所有子组件,再调用grid_remove()把它们都隐藏后,Frame却不会自动缩小回原来的大小,这和我想要的结果不一样。
我还发现了一个更奇怪的现象,按下面的步骤操作:
- 给Frame添加20个组件
- 调用
grid_remove()把所有组件都隐藏 - 再添加10个组件
结果却是:
- Frame会调整尺寸适配20个组件的大小
- 移除所有组件后,Frame尺寸不变
- 新增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
相关产品推荐
相关产品推荐

