1

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

布局

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

4

1 回答 1

3

有很多方法可以完成您的任务。重要的是不要试图一次解决所有的布局问题。您需要采取“分而治之”的方法。将 UI 分成逻辑组,排列组,然后将每个组分成更小的组并排列它们,依此类推。

例如,以下是我可能会如何进行这种特殊安排:

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

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

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

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 的一般结构就设置好了。您甚至可以在不添加任何其他小部件的情况下测试调整大小行为。给每个部分一个不同的颜色和一个临时大小,然后通过调整窗口大小来尝试查看每个部分的响应方式。

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

例如,ctrmid看起来很完美,pack因为顶部有一个大的小部件,底部有一个较小的小部件。

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

我不明白的另一件事是 grid_rowconfigure/columnconfigure 中的权重。...(即重量为 1 和重量为 3 在另一个框架上意味着 3 将以 1 大小的 1/3 增长)。

你有那个倒退。权重描述了额外空间是如何分配的,权重是成比例的。权重为 2 意味着行或列将获得两倍于权重为 1 的列的额外空间。

于 2017-11-23T14:00:29.090 回答