【问题标题】:Why does .grid behave like this?为什么 .grid 会这样?
【发布时间】:2014-05-20 15:19:21
【问题描述】:

在学习了基本的 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()

【问题讨论】:

  • 我怀疑这与您的问题有关,但您知道吗?在您的代码中,Label1Label6 都是 None,因为您没有为它们分配标签,而是分配了 grid 的结果。
  • @Kevin 嘿伙计,谢谢。这真是太好了。它不在教程中(到目前为止)

标签: python-3.x tkinter


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 很好地解释了grid 问题。我不认为你知道一个很好的独立问题来解释这个问题?我正在寻找我可以指向人们的“规范”帖子。 ttk button returns None 是迄今为止我找到的最好的。
猜你喜欢
  • 2018-10-15
  • 2011-06-03
  • 2018-06-08
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多