Tkinter 中的框架是不是包含本地网格系统?

Posted

技术标签:

【中文标题】Tkinter 中的框架是不是包含本地网格系统?【英文标题】:Do frames in Tkinter contain local grid systems?Tkinter 中的框架是否包含本地网格系统? 【发布时间】:2021-12-31 14:49:16 【问题描述】:

非常简单的问题,我在 Stack Exchange 上找不到答案。 (只有这个误导性的线程:Python3 Tkinter: Grids Within Grids? Frames Alongside Other Frames? 遗憾地没有回答这个问题)。

我正在使用 tkinter 和 Python 来尝试使用 GUI 的程序。可惜我完全不懂网格系统。

我的印象是每个框架都包含自己的网格系统,其中 0,0 是该框架的左上角。

我创建了这段代码:

root = Tk()

main_frame = Frame(root, width='1520', height='1080', bg='#a1a1a1').grid(row=0, column=1)
side_frame = Frame(root, width='400', height='1080', bg='#757575').grid(row=0, column=0)

header_label = Label(main_frame, text='Heading', font=('Agency', 48), bg='#a1a1a1', fg='#ffffff').grid(row=0, column=0)

并希望由于主框架中的标签设置为(0,0),因此标签会出现在主框架中。然而,它没有。我觉得这有点奇怪和不安。下面是正在发生的事情的图片 - 标题标签出现在“side_frame”中。

Faulty layout picture

有人可以向我解释一下网格系统是如何工作的吗?在我尝试向 main_frame 添加滚动条之前,我并没有真正遇到麻烦 - 然后我意识到 tkinter 中嵌入了一些严重的尴尬,我想正确理解它。

谢谢!

【问题讨论】:

tkinter 中的每个大师都有自己的网格,这是真的。但是您错过了将构造函数与几何方法分开。虽然构造函数返回对您的对象的引用,但构造函数返回与 root 相同的 None,因为 root 窗口是默认的主参数。另外here some useful tips 【参考方案1】:

问题是您将main_frameside_frame 设置为None,因此将其作为任何其他小部件的父级传递将使该小部件成为根小部件的子级。

这是因为在 python 中x=y().z()x 的值设置为z()。因此,当您执行main_frame = Frame(...).grid(...) 时,会将main_frame 设置为.grid(...) 的结果,而grid 总是返回None

您应该将小部件创建与小部件布局分开,这就是原因之一。另一个重要原因是它使代码更易于阅读和可视化。

main_frame = Frame(root, width='1520', height='1080', bg='#a1a1a1')
side_frame = Frame(root, width='400', height='1080', bg='#757575')

main_frame.grid(row=0, column=1)
side_frame.grid(row=0, column=0)

【讨论】:

谢谢!我不完全理解这与分离它们有何不同的细节,但你肯定解决了我的问题。现在等待下一个问题出现......:D

以上是关于Tkinter 中的框架是不是包含本地网格系统?的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter 网格动态布局

带有网格的 tkinter 画布滚动条?

在 tkinter 中抖动边界

python基础 Tkinter 之 几何管理器

python基础 Tkinter 之 几何管理器

如何在 Tkinter 中切换到不同的框架? [复制]