Когда вы изменяете размер окна, чтобы сделать его меньше предпочтительного размера, у tkinter нет другого выбора, кроме как начать уменьшать размер внутренних виджетов.Поскольку вы используете pack
, pack
начнется с уменьшения размера виджета, который был упакован последним.Как только он исчезнет, он выберет ближайший к последнему виджет и т. Д.
В вашем случае нижний текстовый виджет упаковывается последним, поэтому он сокращается первым.В вашем случае вы хотите, чтобы верхний текстовый виджет был тем, который растёт и сжимается, поэтому он должен быть тем, который вы упаковываете последним.
Лично я нахожу код намного проще для чтения, если вы группируете виджеты вместе, чтоиметь одного и того же родителя или мастера и отделить команды макета от команд создания виджетов.Это значительно упрощает визуализацию отношений между виджетами.В вашем случае я бы переписал код, чтобы он выглядел следующим образом.
Обратите внимание, что я сначала создаю все виджеты, которые находятся непосредственно в корне, а затем все виджеты, которые находятся внутри top
, и что я сгруппировал создание виджетов вместе, а затем сгруппировал макетвиджетов вместе.Также обратите внимание на порядок упаковки top
и text2
.
top=Frame(self.root)
text2=Text(self.root, height=1, background="pink")
text2.pack(side=BOTTOM, fill=BOTH, expand=False)
top.pack(side=TOP, fill=BOTH, expand=True)
text1=Text(top)
scroll=Scrollbar(top)
text1.config(yscrollcommand=scroll.set)
text1.config(state="disabled")
scroll.config(command=text1.yview)
text1.pack(side=LEFT, fill=BOTH, expand=True)
scroll.pack(side=RIGHT, fill=Y)
Примечание:
Порядок управления виджетами называется упаковочным списком ..Обычный способ изменить упаковочный лист - это упаковать товары в другом порядке, как в приведенном выше примере.Однако вы можете явно запросить, чтобы элементы были размещены в другом порядке.Например, вы можете продолжить сначала упаковывать виджет top
, но когда вы упаковываете text2
, вы можете использовать before=top
, чтобы сообщить pack
, что вы хотите, чтобы нижний текстовый виджет был перед верхним виджетом в упаковке.список.
top.pack(side=TOP, fill=BOTH, expand=True)
text2.pack(side=BOTTOM, fill=BOTH, expand=False, before=top)