使用python tkinter时为什么帧大小调整?

时间:2017-07-13 17:42:41

标签: python tkinter

我的代码如下:

import tkinter as tk

#setting up window.
root = tk.Tk()
root.title("CSV Maker")
root.geometry("600x300")

#setting up frames.
leftFrame = tk.Frame(root, bg="red", width=300, height=300)
rightFrame = tk.Frame(root, bg="blue", width=300, height=300)
#placing frames on window.
leftFrame.grid(row=0, column=0)
rightFrame.grid(row=0, column=1)

#setting up labels.
inputPathLabel = tk.Label(leftFrame, text="Input File Path:")

#placing labels on frames.
inputPathLabel.grid(row=0, column=0)
root.mainloop()

当我删除标签时,我得到以下内容:

Without label

然而,当我将代码留在下面(带有标签)时,我会得到一个完全不同的结果。似乎框架被调整为另一个尺寸而不是我选择的尺寸并且颜色消失了。这是为什么?

With label

1 个答案:

答案 0 :(得分:1)

这就是tkinter的设计工作方式。当您使用packgrid时,框架(或任何其他窗口小部件)将缩小或展开以尝试适合其所有内容。

99.9%的时间,这是你想要的行为。 Tkinter非常擅长使GUI成为合适的大小。

来自grid的官方文档:

  

网格几何管理器通常计算主设备必须达到多大才能完全满足其从设备的需求,并将主设备的请求宽度和高度设置为这些尺寸。这会导致几何信息通过窗口层次结构向上传播到顶级窗口,以便整个子树自身调整大小以适应叶窗口的需要。然而,网格传播命令可用于关闭一个或多个主设备的传播。如果禁用传播,则网格不会设置主窗口的请求宽度和高度。例如,如果您希望主窗口具有您指定的固定大小,这可能很有用。

来自pack的文档:

  

封隔器通常计算主机必须达到多大才能完全满足其从属设备的需要,并且它将主机的请求宽度和高度设置为这些尺寸。这会导致几何信息通过窗口层次结构向上传播到顶级窗口,以便整个子树自身调整大小以适应叶窗口的需要。然而,包传播命令可用于关闭一个或多个主设备的传播。如果禁用传播,则封隔器将不会设置封隔器的请求宽度和高度。例如,如果您希望主窗口具有您指定的固定大小,这可能很有用。

请注意place没有相同的行为。来自place文档:

  

与许多其他几何管理器(例如打包器)不同,布局器不会尝试操纵主窗口的几何形状或从属窗口的父窗口(即它不设置其请求的大小)。要控制这些窗口的大小,请将它们设置为窗口,如框架和画布,为此提供配置选项。