【问题标题】:Difference between "fill" and "expand" options for tkinter pack methodtkinter pack 方法的“填充”和“扩展”选项之间的区别
【发布时间】:2015-03-21 07:31:52
【问题描述】:

我知道这是一个太琐碎的问题,但我是 python 新手,我刚刚开始使用 tkinter 模块。其实我到处查了一下,也找不到满意的答案。我发现了以下内容:

fill 选项:它决定是使用更多空间还是保留 “自己的”维度。

expand 选项:处理父窗口小部件的扩展。

问题是这两个听起来或多或少相同。我什至通过在 fill 的 4 个值和 expand 的 2 个值之间切换来尝试一些示例,但在 2 或 3 个案例中收到或多或少相同的输出,因此我有这个查询。在这方面的任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    来自effbot

    fill 选项告诉管理器小部件想要填充分配给它的整个空间。该值控制如何填充空间; BOTH 表示小部件应该水平和垂直扩展,X 表示它应该只水平扩展,Y 表示它应该只扩展垂直。

    expand 选项告诉管理员为小部件框分配额外的空间。如果父小部件的大小超过了容纳所有打包小部件所需的大小,则任何超出的空间都将分配给所有 expand 选项设置为非零值的小部件。

    所以fill 告诉小部件在指定的方向上增长到尽可能多的可用空间,expand 告诉主机占用任何未分配给任何小部件的空间并将其分配给所有具有非零 expand 值。

    运行这个例子时区别就很明显了:

    import Tkinter as tk
    
    root = tk.Tk()
    root.geometry('200x200+200+200')
    
    tk.Label(root, text='Label', bg='green').pack(expand=1, fill=tk.Y)
    tk.Label(root, text='Label2', bg='red').pack(fill=tk.BOTH)
    
    root.mainloop()
    

    您可以看到带有expand=1 的标签被分配了尽可能多的可用空间,但仅在指定的方向Y 上占用它。 带有fill=tk.BOTH 的标签可双向扩展,但可用空间较小。

    【讨论】:

    • 哦,对不起,从你描述的方式来看,我认为它来自其他地方。要对这两个选项有更多感觉,您可以稍微尝试一下示例中的选项,从 label1 中删除 expand,将两者都设置为 expand 为 1,尝试 fill=tk.X... 背景颜色真正显示了小部件使用主控的哪个部分(在这种情况下是根)。
    • 是的,我试过了。我开始假设python默认将整个水平空间分配给一个小部件。因此,即使expand = 0fill = X 小部件填充了整个水平屏幕空间。但是,如果写入了expand = 0fill = Y,则小部件大小保持不变。对吗?
    • 是的,这对于包含 side=TOP(默认)和 BOTTOM 的小部件是正确的。对于side=LEFTRIGHT,小部件会自动在Y 方向展开。您可以通过为两者设置fill=BOTH 和为其中之一设置side=LEFT 来查看。
    • 太棒了!为side=LEFTside=RIGHT 试了一下,得到了你提到的结果。当然,这消除了关于fillexpand 选项的所有疑虑。再次感谢!
    【解决方案2】:

    我已经完成了反复试验。这是一个概述:

    import tkinter as tk
    
    root = tk.Tk()
    root.geometry()
    
    for e, expand in enumerate([False, True]):
        for f, fill in enumerate([None, tk.X, tk.Y, tk.BOTH]):
            for s, side in enumerate([tk.TOP, tk.LEFT, tk.BOTTOM, tk.RIGHT]):
                position = '+{}+{}'.format(s * 205 + 100 + e * 820, f * 235 + 100)
                win = tk.Toplevel(root)
                win.geometry('200x200'+position)
                text = str("side='{}'\nfill='{}'\nexpand={}".format(side, fill, str(expand)))
                tk.Label(win, text=text, bg=['#FF5555', '#55FF55'][e]).pack(side=side, fill=fill, expand=expand)
                    
    root.mainloop()
    

    【讨论】:

    • 这是一个很好的视觉指南!虽然我不完全同意expand=True overrules side='...'。当您只有一个小部件(例如在您的示例中)时可能看起来是这样,但当您有多个小部件时肯定不是这样。
    • 我的错,确实我只查看了带有单个小部件的窗口。我改了。
    • 非常感谢!这是我找到的最佳答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2011-03-04
    • 2011-07-19
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多