Как сохранить TextBox видимым при изменении / уменьшении размера окна приложения tkinter - PullRequest
1 голос
/ 12 мая 2019

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

top=Frame(self.root)
top.pack(side=TOP, fill=BOTH, expand=True)
text1=Text(top)
text1.pack(side=LEFT, fill=BOTH, expand=True)
scroll=Scrollbar(top)
scroll.pack(side=RIGHT, fill=Y)
scroll.config(command=text1.yview)
text1.config(yscrollcommand=scroll.set)
text1.config(state="disabled")
text2=Text(self.root, height=1)
text2.pack(side=BOTTOM, fill=BOTH, expand=False)
self.root.mainloop()

1 Ответ

2 голосов
/ 12 мая 2019

Когда вы изменяете размер окна, чтобы сделать его меньше предпочтительного размера, у 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...