首页 > 解决方案 > Python Tkinter 网格管理器忽略了先前项目的大小和包装框架

问题描述

在此处输入图像描述在此处输入图像描述

我以为网格管理器非常简单,但我被卡住了。我基本上有三个框架,从主窗口开始,每个框架都使用前一个作为主窗口。

我试图在第二个框架内创建 12 个块,但是当我尝试创建块时,它会环绕其主框架并在最后添加额外的空间。

我也不明白为什么我可以更改 hScroll 宽度以更改其主框架的大小,例如设置为 1000,但更改其主框架的宽度,即使增加大小也无济于事。

我正在尝试学习如何使用 Tkinter,并且正在寻找我在这里概念上搞砸的地方,而不仅仅是代码修复。

# Main frame
worksheetFrame = tk.Frame(tkRoot, width=2000, height=800, background='BLUE')
worksheetFrame.grid(row=0, column=0, padx=(100, 0), pady=(60, 0))

# Horizontal scrollbar
hScroll = tk.Frame(worksheetFrame, width=1000, height=20, background='RED')
hScroll.grid(row=1, column=0)

# Month frames
for i in range(12):
    monthFrame = tk.Frame(worksheetFrame, width=200, height=400, background='YELLOW')
    monthFrame.config(borderwidth = 2, relief=tk.GROOVE)
    monthFrame.grid(row=0, column=i, sticky=tk.W)

    # Vertical scrollbars
    vScroll = tk.Frame(monthFrame, width=20, height=400, background='GREEN')
    vScroll.grid(row=0, column=i)

标签: pythonfor-loopuser-interfacetkintertkinter-layout

解决方案


我试图在第二个框架内创建 12 个块,但是当我尝试创建块时,它会环绕其主框架并在最后添加额外的空间。

什么都没有包装。您在第 0 列中有一个绿色框架,然后其他 11 个框架在第 1-11 列中。

我认为您缺少的是您试图将其中一个狭窄的绿色框架放在 的第 0 列中worksheetFrame,该列与具有水平滚动条的列相同。您已强制滚动条为 1000 像素宽,这导致第 0 列的宽度为 1000 像素。当你把一个 20 像素宽的框架放在一个 1000 像素的列中时,会有很多未使用的空间,这就是你所看到的。

我也不明白为什么我可以更改 hScroll 宽度以更改其主框架的大小,例如设置为 1000,但更改其主框架的宽度,即使增加大小也无济于事。

这又是因为grid默认pack情况下会增大或缩小容器以适应其内容。由于您在worksheetFrameusing中添加了一个子项grid,因此该框架将忽略其请求的宽度并缩小以适合其子项。

如果您想要一个跨越 的宽度的水平框架,则worksheetFrame需要使用columnspan它以使其跨越所有列:

hScroll.grid(row=1, column=0, columnspan=12)

推荐阅读