Python 3.x 网格为什么会这样?

Python 3.x 网格为什么会这样?,python-3.x,tkinter,Python 3.x,Tkinter,在学习了基本Python之后,我现在开始学习编写GUI(tkinter)。所以现在我在玩游戏,试着感受一下几何管理 有件事我不明白为什么会发生。我尝试制作一个网格,以便按照我希望的方式设置布局,如下所示(示例): 这不会在标签之间产生很大的空间,但仍然可以使所有东西都紧挨着彼此。当我跳过一行或一列数字时,为什么它不保留开放空间 我用的是大多数信息,但在其他地方也找不到答案 这是我在需要时使用的完整代码: from tkinter import * from tkinter import ttk

在学习了基本Python之后,我现在开始学习编写GUI(tkinter)。所以现在我在玩游戏,试着感受一下几何管理

有件事我不明白为什么会发生。我尝试制作一个网格,以便按照我希望的方式设置布局,如下所示(示例):

这不会在标签之间产生很大的空间,但仍然可以使所有东西都紧挨着彼此。当我跳过一行或一列数字时,为什么它不保留开放空间

我用的是大多数信息,但在其他地方也找不到答案

这是我在需要时使用的完整代码:

from tkinter import *
from tkinter import ttk

root = Tk()
root.title('Title of the root frame!')

mainFrame = ttk.Frame(root) #root is the parent of the frame
mainFrame.grid(column=0, row=0)
mainFrame['padding'] = (15, 20, 1, 50)
mainFrame['height'] = (10500)
mainFrame['width'] = (100)
mainFrame['borderwidth'] = 5
mainFrame['relief'] = 'sunken'

Frame2 =ttk.Frame(mainFrame)
Frame2.grid(column=0, row=0)
Frame2['borderwidth'] = 100

Frame2['relief'] = 'sunken'
Labelfr2 = ttk.Label(Frame2, text = 'labelfr2 in Frame2').grid(column=1, row =1)


Label1 = ttk.Label(mainFrame, text='The label1').grid(column=1, row=1)
Label2 = ttk.Label(mainFrame, text='The label2').grid(column=3, row=2)
Label3 = ttk.Label(mainFrame, text='The label3').grid(column=5, row=3)
Label4 = ttk.Label(mainFrame, text='The label4').grid(column=45, row=4)
Label5 = ttk.Label(mainFrame, text='The label5').grid(column=109, row=6)
Label6 = ttk.Label(mainFrame, text='The label6').grid(column=115, row=7)

root.mainloop()

为什么没有很多额外的空间?因为默认情况下,列的宽度为零,而行的高度为零。如果列中没有任何内容,则该列将不可见

顺便说一下,你犯了一个很常见的错误。方法
grid
总是返回
None
,如果返回
foo=x().y()
,foo的值总是
y()
。因此,当您执行类似于
Label1=ttk.Label(…).grid(…)
的操作时,Label1将设置为
None

最佳实践——不管一些教程向您展示了什么——是将小部件创建与小部件布局分开。例如,我将您的代码更改为:

Label1 = ttk.Label(...)
Label2 = ttk.Label(...)
...

Label1.grid(...)
Label2.grid(...)
...

通过将给定容器小部件的所有布局保持在一起,您的代码更易于可视化,并且随着时间的推移更易于维护。

我怀疑这与您的问题有关,但您知道吗?在您的代码中,
Label1
Label6
都是
None
,因为您没有给它们分配标签,而是分配了
grid
的结果@Kevin Hey man,谢谢。知道这件事真是太好了。关于
grid
问题,本教程(到目前为止)没有很好的解释。我想你不知道一个很好的独立问题来解释这个问题吧?我正在寻找一个“规范”的帖子,我可以向人们指出。是目前为止我找到的最好的。
Label1 = ttk.Label(...)
Label2 = ttk.Label(...)
...

Label1.grid(...)
Label2.grid(...)
...