Изменение размера прокручиваемого текстового поля Tkinter - PullRequest
1 голос
/ 12 декабря 2010

Я хотел бы создать прокручиваемое текстовое поле Tkinter, которое заполняет максимально выделенное пространство.У меня это работает вроде ...

По какой-то причине, когда я растягиваю окно, текстовый виджет в порядке;Однако полоса прокрутки получает тонны отступов по оси X.

Вторая проблема - когда я уменьшаю окно, полоса прокрутки выходит из экрана.

Кто-нибудь знает решения этих двух программ?

фрагмент:

    self.Fr = Tkinter.Frame(self, width=self.Wi, height=self.He)
    self.Fr.pack(side='right', fill='both', expand='yes')


    self.Te = Tkinter.Text(self.Fr, font=self.Fo, fg=self.FG, bg=self.BG,
                           selectforeground=self.SFG,
                           selectbackground=self.SBG,
                           insertbackground=self.IBG, wrap='word',
                           undo=True, maxundo=100)
    #self.Te.grid(column=0, row=0, sticky='NSEW')
    self.Te.pack(side='left', fill='both', expand='yes')


    self.Sc = Tkinter.Scrollbar(self.Fr, elementborderwidth=1)
    #self.Sc.grid(column=1, row=0, sticky='NSEW')
    self.Sc.pack(side='right', fill='both', expand='yes')

    self.Te.configure(yscrollcommand=self.Sc.set)
    self.Sc.configure(command=self.Te.yview)

1 Ответ

6 голосов
/ 13 декабря 2010

Ваша полоса прокрутки получает все отступы, потому что вы используете fill='both'.Несмотря на то, что это вертикальная полоса прокрутки, вы попросили ее занять дополнительное место вдоль оси x, что приводит к заполнению, поскольку сама полоса прокрутки не растягивается, чтобы сделать широкую полосу прокрутки.Вы хотите, чтобы вертикальные полосы прокрутки заполняли только направление Y, а горизонтальные - в направлении X.

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

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

Упомянутый выше «порядок» является порядком списка упаковки.В частности, порядок, в котором товары были упакованы.Таким образом, если вы упакуете текстовый виджет, а затем полоса прокрутки, Tk сначала разместит текстовый виджет, и все оставшееся пространство будет выделено для полосы прокрутки.Если бы вы сначала запаковали полосу прокрутки, она бы выложилась, а оставшееся место было бы отдано текстовому виджету.

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

Общее правило заключается в том, чтобы удостовериться, что последний упакованный вами виджет - это тот, у которого expand установлено в true.Это ваш "упругий" виджет.Таким образом, все виджеты фиксированного размера будут занимать столько места, сколько им нужно, а ваш «упругий» виджет займет все, что осталось.

Существует еще одно решение, которое заключается в том, чтобы дать вашему текстовому виджету запрошенную ширину и высоту, равную единице.При этом, когда упаковщик первоначально выделяет пространство, он выделяет лишь небольшое количество пространства.Таким образом, когда окно сжимается, текстовый виджет будет сжиматься до тех пор, пока не уменьшится до этого крошечного размера.Это не очень практично, поскольку одной из замечательных особенностей пакета является то, что вы можете присвоить всем виджетам их естественный размер (или они принимают свой естественный размер на основе их содержимого в случае кнопок и меток), а упаковщик делает всеработа.Если вы установите ширину и высоту равными единице, ваше начальное окно (если явно не установлено большее значение) будет довольно маленьким.

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

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