В каких случаях grid () Tkinter нельзя смешивать с pack ()? - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу исключить странное дополнительное пространство, которое, по-видимому, не поддается изменению размера в моем макете при использовании только grid(), но вызов pack() иногда ухудшает ситуацию: GUI просто исчезает полностью!

Я прочитал несколько откровенных ответов на макеты от @Bryan Oakley, таких как:

Когда использовать макеты пакетов или сетки в tkinter?

и

Tkinter: сетка или пакет внутри сетки?

но когда я начинаю писать свои собственные вещи, у меня все еще часто возникают проблемы.

Мое понимание:

  1. У меня должна быть рамка для заполнения root window, иначе не было бы надежды заполнить дополнительное пространство в окне, однако я настраиваю только виджеты.
  2. Для всехдочерние виджеты, находящиеся внутри общего родителя Frame, я должен использовать либо pack(), либо grid(), но не оба.
  3. При использовании grid() в кадре обязательно указывать Frame.grid_rowconfigure() и .grid_columnconfigure() с ненулевыми weight аргументами.В противном случае ничего бы не появилось.
  4. Таким образом, можно получить основной Frame, используя pack(), но его непосредственный дочерний элемент Frames, все используя grid();Внутри каждого из этих дочерних Frames в сетке мы могли бы pack() их собственные дочерние виджеты.Другими словами, мы могли бы чередовать grid() и pack() по «регионам» или уровням иерархии контейнера, но никогда не смешивать их в одном и том же контейнере: единственное ограничение.
  5. При тщательном расчете веса я могзаполните горизонтальное пространство в родительском элементе Frame дочерним элементом Frame, заполненным горизонтальными элементами, например, все виджеты используют grid(sticky='nsew'), а дочерний элемент Frame использует pack(side='top', fill='both', expand=True).

Если мое понимание было правильным, то я никогда не мог понять, почему №5 не мог работать для меня, например, всегда есть неиспользуемое дополнительное пространство к правому концу моего горизонтального ребенка Frame внутри основного Frame изкорневое окно.

ОБНОВЛЕНИЕ 2

Я понял это.# 5 не работал для меня, потому что я забыл указать .grid_columnconfigure(0, weight=1) в основном Frame перед использованием grid().Виноват!Дело закрыто.

ОБНОВЛЕНИЕ

Я нахожусь на macOS High Sierra, работаю на python 3.6.4 Homebrew.

1 Ответ

0 голосов
/ 30 ноября 2018

В каких случаях сетка Tkinter () не может быть смешана с pack ()?

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

  1. У меня должна быть рамка для заполнения корневого окна, иначе не было бы надежды заполнить дополнительное пространство в окне, однако я настраиваю только виджеты.

Это не правильно.Вы можете легко заполнить все пространство в корневом окне, не используя рамку.

Для всех дочерних виджетов, находящихся внутри общего родительского фрейма, я должен использовать либо pack (), либо grid (), но не оба.

Это правильно.Третий вариант - использовать place, хотя это редко лучший выбор.

При использовании grid () во фрейме обязательно указывать Frame.grid_rowconfigure () и .grid_columnconfigure () с аргументами с ненулевым весом.В противном случае ничего бы не появилось.

Это не так - настройка строк и столбцов с ненулевым весом не обязательна.Обычно это лучшая практика, но она не требуется для отображения виджетов.Вес применяется только к тому, как grid управляет дополнительным пробелом.Любые виджеты с ненулевым размером должны отображаться независимо от того, используете вы вес или нет.

Таким образом, можно получить основной фрейм с помощью pack (), но все его непосредственные дочерние фреймы используют grid ()

Правильно.

Путем тщательного взвешивания я мог бы заполнить горизонтальное пространство в родительском фрейме дочерним фреймом, заполненным горизонтальными виджетами, например, все виджеты используют сетку (sticky = 'nsew'), а дочерний фрейм использует пакет(сторона = "верх", заполнить = "оба", развернуть = True).

Это правильно.

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