Метод tkinter .pack не делит пространство должным образом - PullRequest
0 голосов
/ 28 сентября 2018

Попытка выяснить порядок упаковки.Книга говорит

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

Итак, я написали не могу понять, почему ярлыки Запада и Востока не расширяются, чтобы разделить часть вертикального пространства Севера:

from tkinter import *

root = Tk()

north = Label(root,text='North', bg='cyan')
north.pack(side=TOP, expand=YES, fill=BOTH)

west = Label(root,text='West', bg='red')
west.pack(side=LEFT, expand=YES, fill=BOTH)

east = Label(root,text='East', bg='green')
east.pack(side=RIGHT, expand=YES, fill=BOTH)

root.mainloop()

Обрезанный снимок экрана с тем, что я вижу:

Cropped screen-shot of what I see

Cropped image of what I'd like to see

1 Ответ

0 голосов
/ 28 сентября 2018

Когда вы упакуете north наверх, он займет всю ширину доступного пространства.Как только вы упакуете что-то сверху, ничто больше не сможет пройти слева или справа от него (без использования некоторых редко используемых дополнительных опций).Когда вы упакуете west влево, оно должно опуститься ниже north.

Вот официальное описание полного алгоритма упаковщика:

Для каждого мастера упаковщик ведет упорядоченный список ведомых, называемый списком упаковки.Параметры конфигурации -in, -after и -before используются для указания ведущего устройства для каждого ведомого устройства и положения ведомого устройства в списке упаковки.Если ни одна из этих опций не указана для ведомого, то ведомое добавляется в конец списка упаковки для его родителя.

Упаковщик упорядочивает ведомые устройства для главного устройства, сканируя список упаковки по порядку.В то время, когда он обрабатывает каждого ведомого, прямоугольная область внутри мастера все еще не выделена.Эта область называется полостью;для первого подчиненного устройства - вся область ведущего устройства.

Для каждого подчиненного устройства упаковщик выполняет следующие шаги:

  1. Упаковщик выделяет прямоугольную посылку дляраб по стороне полости, заданной опцией ведомой стороны.Если сторона является верхней или нижней, то ширина участка - это ширина полости, а ее высота - запрашиваемая высота ведомого устройства плюс параметры -ipady и -pady.Для левой или правой стороны высота участка - это высота полости, а ширина - запрашиваемая ширина ведомого устройства плюс опции -ipadx и -padx.Посылка может быть увеличена дополнительно из-за опции -expand (см. РАСШИРЕНИЕ ниже)

  2. Упаковщик выбирает размеры подчиненного устройства.Ширина обычно будет запрашиваемой шириной ведомого устройства плюс вдвое больше его опции -ipadx, а высота будет обычно запрашиваемой высотой ведомого устройства плюс двойная его опция -ipadyОднако, если параметр -fill равен x или обоим, тогда ширина подчиненного устройства увеличивается, чтобы заполнить ширину участка, минус удвоенная опция -padx.Если опция -fill равна y или обеим, тогда высота ведомого устройства увеличивается, чтобы заполнить ширину участка, минус удвоенная опция -pady.

  3. Упаковщик размещает ведомое устройство надего посылка.Если ведомое устройство меньше посылки, то опция -anchor определяет, где в посылке будет размещено ведомое устройство.Если -padx или -pady отличны от нуля, то заданное количество внешних отступов всегда будет оставаться между ведомым устройством и краями пакета.

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

Взято из http://tcl.tk/man/tcl8.5/TkCmd/pack.htm#M26

Из той же документации говорится о расширении (атрибут expand):

Дополнительное горизонтальное пространство распределяется среди расширяемых ведомых устройств, левая или правая сторона которых и дополнительное вертикальное пространствораспределяется среди расширяемых ведомых, чья сторона находится сверху или снизу.


Чтобы получить желаемое поведение, используя только pack, начните с упаковки двух кадров (или двух из примернолюбой виджет) сверху и снизу.установите атрибут expand на True.Затем нижняя рамка может быть хозяином красной и зеленой рамок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...