Python 如何在tkinter中定位具有网格布局的小部件

Python 如何在tkinter中定位具有网格布局的小部件,python,tkinter,tkinter-layout,Python,Tkinter,Tkinter Layout,我很难用tkinter理解Python网格布局。这里是一个布局,我试图了解如何创建 据我所知,我将创建8帧。顶部框架将包括顶部的3个框架,行为0,列跨度为3。底部框架将包括底部3个框架,一行1个,列跨度3个。有一件事我不明白,就是sticky属性是如何工作的,并在其中起到了作用。另一件我不明白的事情是grid_rowconfigure/columnconfigure中的权重。据我所见,它应该以不同的速率增长每一帧?重量越高,与较小的数字相比,其将越小(即,重量为1,另一帧上的重量为3意味着3将

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


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

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

所有这些问题都不能通过简单的试错来自我回答。尝试一下,如果它看起来和你期望的不一样,但你不知道为什么,那么请在这里发布一个问题。