5

我知道过去有很多关于网格和包装的问题,但我只是不明白如何将两者结合起来,因为我很难在两个方向(行/列)上扩展我的“表格”。

我希望保持相同大小但始终保持在窗口底部的按钮。但是,我希望通过调整窗口大小来自动扩展“表格”,但似乎无法使其正常工作。将 'win1' 更改为 pack 的意义在于它保持中心位置,但仅此而已。

我知道我需要更改术语,如何使用 pack 实现相同的效果,例如粘性等。

代码如下(显示基本框架和几个小部件,不完整代码):

root = Tk()  

win1 = Frame(root)
win1.pack()
win1.grid_columnconfigure(0, weight=1)
win1.grid_rowconfigure(1, weight=1)

frame_table = ttk.Frame(win1, style="Black.TLabel", relief='sunken', borderwidth=1)
frame_table.pack(row=2, column=0, padx=1, pady=1, sticky= "nsew")
frame_table.grid_columnconfigure(0, weight=1)
frame_table.grid_rowconfigure(1, weight=1)
text_table1 = Label(frame_table, text='Number1', bg='white', borderwidth=0)
text_table1.grid(row=1, column=0, sticky="nsew", padx=1, pady=1)
empty1 = Label(frame_table, bg='white', borderwidth=0)
empty1.grid(row=2, column=0, sticky="nsew", padx=1, pady=1)
text_table2 = Label(frame_table, text='Number2', bg='white', borderwidth=0, width=12)
text_table2.grid(row=1, column=1, sticky="nsew", padx=1, pady=1)
empty2 = Label(frame_table, bg='white', borderwidth=0)
empty2.grid(row=2, column=1, sticky="nsew", padx=1, pady=1)

frame_but = ttk.Frame(win1)
frame_but.grid(sticky=S, padx=1, pady=1)
frame_but.grid_columnconfigure(0, weight=1)
frame_but.grid_rowconfigure(1, weight=1)
but1 = ttk.Button(frame_but, text='Start', command=Start)
but1.grid(row=3, column=0, padx=2, pady=1, sticky="S")
4

1 回答 1

18

您的第一个问题是主框架win1没有任何选项。默认情况下,它不会填充它所在的容器部分。因此,无论您对内部小部件做什么,整个东西都会堆叠锚定到窗口的顶部。那么,你应该做的第一件事就是告诉win1填充整个窗口(假设这实际上是你想要它做的):

win1.pack(side="top", fill="both", expand=True)

当您调整窗口大小时,这将导致此框架正确扩展和收缩。

第二个问题是您将第 0 行win的权重设为 1,但您将frame_table第 3 行的默认权重设为 0。我不知道这是否是故意的,但这就是保留标签的原因并且条目小部件粘在屏幕底部,因为空行 0win1正在扩大和缩小以占用额外的空间。

如何学习布局你的小部件

正确的调整大小行为很容易做到正确,但要学习如何做到正确却相当困难。我的建议是,准备一些纸和一支铅笔。画出应用程序的主要区域——每个区域都有不同的属性。例如,底部的一行应该留在底部(状态栏,或者可能是一排按钮)。也许顶部的某些东西(例如工具栏)应该留在顶部,等等。通常只有一个区域是可扩展的,尽管该可扩展区域本身可能分为两个或多个区域。

在这种情况下,我猜你有两个区域:一个表格和一排按钮。画出来很容易。接下来,为每个区域创建一个框架,每个区域创建一个框架。给它们单独的背景颜色,并使用网格或包将它们放置在窗口中,无论哪一种都可以为您提供所需的调整大小行为。如果你有一个简单的布局(每个区域都是从上到下或从左到右),pack 非常棒,如果你真的有一个网格,grid 就很棒。使用这个,调整选项,直到你得到你想要的主要区域的行为。不同的颜色将帮助您查看哪些区域正在调整大小,哪些没有。

一旦您的主要区域工作正常,您就可以开始关注内部部分。再次拿出那支铅笔和纸,对每个子区域做同样的事情。画出内部区域,找出哪些会在容器内生长,哪些不会。也许只有一个主要的子区域,所以你可以跳过这部分。最后,如果您有子区域,请创建框架,再次为它们提供不同的颜色,以便您可以看到正在调整大小的内容。调整设置,直到一切都按照您想要的方式调整大小。起泡,冲洗,重复。

最后,您将无法再细分您的窗口。通常只有几个区域,所以这个过程很快。一旦您将程序的不同区域全部调整为您想要的大小,就该添加实际的小部件了。完成后,您可以返回并从框架中删除颜色。

这很简单,但需要有条不紊的方法。只是将一堆小部件放入一个框架中并尝试随机的事情以使其工作不是正确的方法。有条不紊,在纸上布置您的设计,转移到具有不同颜色的框架上,然后添加您真正的小部件并添加最后的润色。

于 2012-06-29T11:31:56.780 回答