你如何在 tkinter 中使用网格布局定位小部件

How do you position widgets with grid layouts in tkinter

我很难理解 Python 使用 tkinter 的网格布局。这是我试图了解如何创建的布局。

据我了解,我会创建 8 个帧。顶部框架将包括前 3 个框架,一行为 0,列跨度为 3。底部框架将包括底部 3 个框架,一行为 1,列跨度为 3。我不明白的一件事是粘性属性如何工作并在其中发挥作用。我不明白的另一件事是 grid_rowconfigure/columnconfigure 中的权重。据我所知,它应该以不同的速率增长每一帧?权重越高,它与较小的数字相比越小(即权重为 1,在另一帧上权重为 3 意味着 3 将以 1 的 1/3 大小增长)。 ctrleft 框架上的小部件似乎我可以通过使用 pack 制作一条直线并更改填充来将它们设置到位。我错了吗?提前感谢任何愿意花时间提供帮助的人。

有多种方法可以完成您的任务。重要的是不要试图一次解决所有布局问题。您需要采取 "divide and conquer" 方法。将 UI 分成逻辑组,排列组,然后将每个组分成更小的组并排列,依此类推。

例如,我可能会这样安排:

我将从创建六个函数(或六个 类,如果您愿意)开始,每个主要部分一个。 gui 代码的主要部分看起来像这样:

class Example(object):
    def __init__(self):
        root = tk.Tk()
        topleft = self.create_topleft()
        topmid = self.create_topmid()
        ...

逻辑排列似乎是 2x3 网格。假设您希望每个部分在调整 window 大小时均等扩展,我可以为所有行和所有列赋予相同的权重,以便额外的 space 在行和列之间平均分配:

class Example(object):
    def __init__(self):
        ...
        root.grid_rowconfigure(0, weight=1)
        root.grid_rowconfigure(1, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root.grid_columnconfigure(1, weight=1)

最后,我会将小部件放在网格中:

class Example(object):
    def __init__(self):
        ...
        topleft.grid(row=0, column=0, sticky="nsew")
        topmid.grid(row=0, column=1, sticky="nsew")
        ...

至此,UI 的总体结构就设置好了。您甚至可以在不添加任何其他小部件的情况下测试调整大小行为。为每个部分赋予不同的颜色和临时大小,然后通过调整 window 的大小进行实验,看看每个部分如何响应。

您现在可以独立开发每个部分,而不必太担心它们如何影响 GUI 的其余部分。例如,某些部分中的小部件可以使用 pack,有些可以使用 grid,如果最合适,您甚至可以使用 place

例如,ctrmid 似乎非常适合 pack,因为顶部有一个大的小部件,底部有一个较小的小部件。

ctrleft 本身看起来像是两个标签加上一个内框。这些可以用 pack 排列,但是内部框架内的小部件可以使用 grid 来形成 table.

Another thing I don't understand is the weight in grid_rowconfigure/columnconfigure. ...(i.e. weight of 1 with a weight of 3 on another frame means that the 3 will grow at 1/3 the size of the 1).

你说反了。权重描述了extraspace是如何分配的,权重是成正比的。权重为 2 意味着该行或列将获得两倍于权重为 1 的列的额外 space。