【发布时间】:2020-01-03 20:18:04
【问题描述】:
我遇到的大多数主题都涉及如何不缩小 Frame 的内容,但我有兴趣在销毁所述内容后将其缩小。这是一个例子:
import tkinter as tk
root = tk.Tk()
lbl1 = tk.Label(root, text='Hello!')
lbl1.pack()
frm = tk.Frame(root, bg='black')
frm.pack()
lbl3 = tk.Label(root, text='Bye!')
lbl3.pack()
lbl2 = tk.Label(frm, text='My name is Foo')
lbl2.pack()
到目前为止,我应该在我的窗口中看到这个:
Hello!
My name is Foo
Bye!
这很好,但我希望根据需要保持中间层可互换和隐藏。所以如果我销毁里面的lbl2:
lbl2.destroy()
我想看看:
Hello!
Bye!
但我看到的是:
Hello!
███████
Bye!
我想将frm 缩小到基本上不存在的状态,因为我想保持主要小部件的顺序不变。理想情况下,我想运行 frm.pack(fill=tk.BOTH, expand=True) 以便我的内部小部件可以相应地缩放。但是,如果这干扰了缩小,我可以不用fill/expand。
我尝试了以下方法:
-
pack_propagate(0):这实际上并没有扩展框架超过pack()。 - 重新运行
frm.pack():但这会破坏我主要小部件的顺序。 -
.geometry(''):这仅适用于root窗口 - 对于Frames 不存在。 -
frm.config(height=0):奇怪的是,这似乎并没有改变任何东西。 -
frm.pack_forget(): From this answer,但它并没有把它带回来。
它留给我的唯一选择是使用grid 管理器,我想这可行,但不完全是我想要的......所以我很想知道是否有其他方法可以实现这一目标。
【问题讨论】:
-
@stovfl 感谢您的建议,但这只是我的minimal reproducible example。我的真实示例在
frm中有一堆不同的小部件,需要更多控件。有些是Labels、LabelFrames、Buttons……等等…… -
您问题中的代码不是 minimal reproducible example。
-
@martineau 你能澄清一下吗?我的问题中的代码产生了我想要更改的结果。如果您的意思是我应该在其中包含所有其他小部件,那可不是一个简单的例子?
-
“和Label要求的高度一样”:自己数,循环
frm.children ; <child ref>.winfo_height() -
@r.ook "在
lbl2.destroy()之后,什么都没有":是的,在你的例子中,它什么都没有导致height == 0。但是您声称您还有其他可以计算的小部件。
标签: python python-3.x tkinter tkinter-layout