有很多方法可以完成您的任务。重要的是不要试图一次解决所有的布局问题。您需要采取“分而治之”的方法。将 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 的列的额外空间。