Заданный размер кадра подавляется при использовании менеджера геометрии pack () для метки - PullRequest
0 голосов
/ 24 марта 2019

Я всегда находил менеджер геометрии pack () довольно неоднозначным с точки зрения того, как он работает при добавлении виджетов. Здесь у меня есть простой код для создания нового фрейма в гораздо большем родительском фрейме. Размер кадра был установлен на 300x300. Проблема в том, что если я создаю метку с менеджером геометрии pack () внутри этого фрейма, он будет подавлять исходный размер фрейма. По сути, рамка станет такой же большой, как и этикетка. Если я использую менеджер геометрии place (), проблем не будет, и рамка останется с исходным размером 300x300.

Вопрос в том, почему упаковка этикетки в рамке влияет на ее размер? И каков наилучший способ избежать этой проблемы и зафиксировать все по размеру, как они установлены?

class MainRightFrame(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.place(x=600, y=0)
        self.config(height=300, width=300, bg='green')

        label = Label(self, text='Left Frame')
        label.place(x=10, y=10)      # OPTION 1
        # label.pack()               # OPTION 2

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Почему упаковка этикетки в рамке влияет на ее размер?

Потому что так устроен упаковщик.Он будет уменьшаться или увеличиваться в соответствии с его содержимым, что вам нужно в 99,99% случаев.

Каноническая документация о том, как работает pack, приведена в официальной документации по tcl / tk здесь:

Алгоритм упаковщика

И каков наилучший способ избежать этой проблемы и зафиксировать все по размеру, как они установлены?

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

За более чем пару десятилетий написания графических интерфейсов для Python / tkinter и tcl / tk я никогда не использовал place, за исключением крайне особых обстоятельств.Его просто слишком сложно использовать для обязательных распространенных макетов.

Если вы абсолютно настаиваете на использовании pack или grid без этого поведения "сжать, чтобы соответствовать", вы можете передать ложное значение в pack_propagateили grid_propagate метод содержащего кадра (например: self.pack_propagate(False)).По моему опыту это очень редко правильное решение.

0 голосов
/ 25 марта 2019

Чтобы исправить это, добавьте следующую строку после начала строки: self.config(...:

self.pack_propagate(0)

См. здесь для документального фильма, объясняющего это.

Как@ KārlisRieksts отметил, что этот подход не работает, однако, если фрейм (или другой родительский виджет) упакован с менеджером геометрии place ().Дочерние виджеты будут влиять на размер родительского элемента.

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