.grid为什么会这样?

时间:2014-05-20 15:19:21

标签: python-3.x tkinter

在学习了基本的Python之后,我开始学习编码GUI(tkinter)。所以现在我正在玩,试图了解几何管理。

有些事情我无法弄清楚它为什么会发生。我尝试制作一个网格,以便按照我想要的方式设置布局(示例):

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

这不会在标签之间产生大量空间,但仍然可以使所有东西彼此相邻。当我跳过行号或列号时,为什么不在那里保留开放空间?

我使用http://www.tkdocs.com/tutorial/获取大部分信息,但也无法在其他任何地方找到答案。

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

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()

1 个答案:

答案 0 :(得分:2)

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

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

最佳实践 - 无论某些教程向您展示什么 - 是将窗口小部件创建与窗口小部件布局分开。例如,我会将您的代码更改为:

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

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

通过将给定容器小部件的所有布局保持在一起,它使您的代码更容易可视化并且更容易维护。