Почему.grid ведет себя так?

Теперь я начинаю изучать графический интерфейс (tkinter) после изучения базового Python. Итак, теперь я играю, пытаясь почувствовать управление геометрией.

Я не могу понять, почему это происходит. Я пытаюсь создать сетку, чтобы получить свой план, настроенный так, как я хочу, как это (пример):

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 ответ

Почему нет лишнего места? Поскольку столбцы по умолчанию имеют ширину нуля, а строки имеют высоту по умолчанию, равную нулю. Если в столбце ничего нет, этот столбец будет невидим.

Кстати, вы делаете очень распространенную ошибку. grid метода всегда возвращает None, и если вы выполняете foo = x().y(), foo всегда будет иметь значение y(). Таким образом, когда вы делаете что-то вроде Label1 = ttk.Label(...).grid(...), Label1 будет установлено значение None.

Лучшая практика - независимо от того, что показывают некоторые уроки, - это отделить создание виджета от макета виджетов. Например, я бы изменил ваш код:

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

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

Сохраняя все макет вместе для данного виджета контейнера, он делает ваш код более легким для визуализации и упрощается с течением времени.

licensed under cc by-sa 3.0 with attribution.