【问题标题】:How to stop Tkinter Frame from shrinking to fit its contents?如何阻止 Tkinter Frame 缩小以适应其内容?
【发布时间】:2010-10-08 12:12:06
【问题描述】:

这是给我带来麻烦的代码。

f = Frame(root, width=1000, bg="blue")
f.pack(fill=X, expand=True)

l = Label(f, text="hi", width=10, bg="red", fg="white")
l.pack()

如果我用 Label 注释掉行,Frame 会以正确的宽度显示。但是,添加标签似乎会将框架缩小到标签的大小。有没有办法防止这种情况发生?

【问题讨论】:

    标签: python label tkinter frame


    【解决方案1】:

    默认情况下,packgrid 都会缩小或扩大小部件以适应其内容,这在 99.9% 的情况下都是您想要的。描述此功能的术语是几何传播。使用pack (pack_propagate) 和grid (grid_propagate) 时,有一个命令可以打开或关闭几何传播。

    由于您使用的是pack,因此语法为:

    f.pack_propagate(0)
    

    或者root.pack_propagate(0),具体取决于您实际想要影响的小部件。但是,因为您没有给出框架高度,所以它的默认高度是 1 个像素,所以您仍然可能看不到内部小部件。要获得所需的全部效果,您需要为包含框架指定宽度和高度。

    话虽如此,绝大多数时候您应该让 Tkinter 计算大小。当您关闭几何传播时,您的 GUI 将无法很好地响应分辨率变化、字体变化等。Tkinter 的几何管理器(packplacegrid)非常强大。您应该学会通过使用适合工作的工具来利用这种力量。

    【讨论】:

    • 它也可以是self.pack_propagate(0),如果在从Frame 派生的小部件类的__init__() 之类的方法中完成——就像在常用的class Application(Frame): 成语中一样。
    • 第一个例子对我不起作用。窗口大小合适,但小部件在屏幕上不可见。第二个例子对我有用,在给定宽度/高度的屏幕上,一切都显示得很好! +1
    • @Bas:在原始示例中,Frame "height" 未传递,默认为 0,因此当关闭传播时,高度保持为 0,您看不到 Label。您必须设置 Frame height=20 或类似的东西才能看到标签。
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多