Я знаю, что вы не можете использовать pack и grid вместе, но почему? Почему возникает ошибка?

_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
2
AashirOverflow 21 Окт 2019 в 00:10

1 ответ

Лучший ответ

Причина в том, что каждый хочет контролировать геометрию всех виджетов внутри данного контейнера (Frame, Toplevel и т. Д.), И каждый из них будет повторно применять свои правила, когда обнаружит, что виджет, которым он управляет, изменяет размер.

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

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

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

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

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

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

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

... и так до конца времени или до тех пор, пока что-то не заставит этот цикл завершиться.

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

Вы также можете (и должны ) использовать пакет и сетку в приложении в целом. У обоих есть сильные и слабые стороны. Например, вы можете использовать пакет для добавления панели инструментов полной ширины, строки состояния полной ширины и средней части для остальной части приложения. Если остальная часть приложения представляет собой форму, возможно, имеет смысл использовать сетку для виджетов в средней части графического интерфейса.

1
Bryan Oakley 20 Окт 2019 в 21:27