首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网格内的Tkinter网格?

网格内的Tkinter网格?
EN

Stack Overflow用户
提问于 2020-02-08 00:03:26
回答 2查看 2.1K关注 0票数 1

我真的很感谢你帮我弄清楚grid几何管理器。

这是我想要建造的东西。

我正在考虑使用网格,但我找不到任何好的教程可以清楚地解释如何使用网格。有很多教程,但大多数都是非常简单或真的过时。

我不知道如何使用网格构建图片中显示的内容,因为所有元素都嵌套在对方内部,每个元素应该在其中包含更多的元素。使用网格来安排最外层的小部件并不难。我只需将工具栏放在第0行,然后将最外层的PanedWidow (绿色)放置到第1行,然后将状态栏放置到第2行。在那之后,我需要在绿色PanedWindow里面安排一些事情。我将另一个PanedWindow (粉红色)放置在绿色PanedWindow的右窗格中,然后将笔记本插入其顶部窗格。

现在,我需要向这些内部窗格添加更多的小部件。例如。我将添加一些按钮到粉红PanedWindow的底部窗格。那就是我遇到问题的地方。

如果我试图使用pack()来安排这些最里面的窗格中的东西,Python会因为使用多个几何管理器而对我大喊大叫。但是当我考虑如何用grid来完成这个任务时,我只是找不到一种方法将最内部的窗格细分为更小的网格。

小部件内部是否存在被外部网格所操作的网格?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-08 01:14:51

当我看到小部件占据一个区域的全部宽度或高度时,我通常使用pack,因为它是专门设计用来在空腔的一侧放置对象的。您可以使用grid,但它需要额外的代码,因为您必须同时添加小部件并配置行和列。使用pack,您所要做的就是添加小部件。

例如,很明显,您希望在底部有一个statusbar,在时间上需要一个工具栏,在中间需要一个窗格小部件。因此,从这一点开始,如下例所示:

代码语言:javascript
复制
import tkinter as tk

root = tk.Tk()
root.geometry("600x400")

toolbar = tk.Frame(root, background="#d5e8d4", height=40)
statusbar = tk.Frame(root, background="#e3e3e3", height=20)
main = tk.PanedWindow(root, background="#99fb99")

toolbar.pack(side="top", fill="x")
statusbar.pack(side="bottom", fill="x")
main.pack(side="top", fill="both", expand=True)

root.mainloop()

注意:为了说明起见,将宽度、高度和颜色添加到框架中,否则,空框架的大小将为1x1。一旦在框架中添加了小部件,就可以删除widthheight选项。

你说右边会有一个窗格窗口,所以在右边加上这个。我们在左边用一个普通的框架。

代码语言:javascript
复制
left_pane = tk.Frame(main, background="#99fb99", width=100)
right_pane = tk.PanedWindow(main, background="#99fb99", width=200)
main.add(left_pane)
main.add(right_pane)

接下来,将两个窗格添加到右侧。为了用尽可能少的代码显示颜色,我将在顶部使用一个框架,而不是笔记本:

代码语言:javascript
复制
notebook = tk.Frame(right_pane, background="#99ceff", height=70)
bottom_right = tk.Frame(right_pane, background="#ffe6cd", height=50)
right_pane.add(notebook)
right_pane.add(bottom_right)

尽管如此,如果您愿意,可以使用grid。诀窍是使用中间框架,因为任何小部件中的布局都独立于父部件或子部件中的布局。

您所需要做的就是删除对pack的前三个调用,并将其替换为以下五行:

代码语言:javascript
复制
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
toolbar.grid(row=0, column=0, sticky="ew")
main.grid(row=1, column=0, sticky="nsew")
statusbar.grid(row=2, column=0, sticky="ew")

由于其他小部件是窗格小部件的子部件,所以没有其他事情可做。添加到每个窗格的任何小部件都有它们自己的独立布局区域,因此可以在每个框架内使用gridpackplace

为了说明这一点,我将使用grid添加几行和几列正方形:

代码语言:javascript
复制
for row in range(6):
    for column in range(30):
        f = tk.Frame(bottom_right, background="white",
                     bd=2, relief="raised", width=10, height=10)
        f.grid(row=row, column=column)

票数 3
EN

Stack Overflow用户

发布于 2020-02-08 00:30:31

我发现了大约两年前的a post,这可能对您的使用来说有点太旧了,但是它有一些关于Tkinter嵌套网格的信息。它建议使用框架来嵌套网格,实质上是在一个框架的子内有孩子。在这些框架中,您可以放置对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60122678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档