Это относительно простая задача, которую нужно решить.
Если вы хотите продолжить создание программы с помощью диспетчера геометрии Grid
, вам необходимо ознакомиться с функциями Grid.rowconfigure()
и Grid.columnconfigure()
.
Они позволяют вам установить параметры конфигурации для Grid
диспетчера геометрии в пределах виджета контейнера. В частности, нам нужен атрибут weight
. Как объяснено здесь :
С каждым столбцом и строкой связана опция сетки "weight" , которая сообщает, насколько она должна расти, если в мастере есть дополнительное пространство для заполнения. По умолчанию вес каждого столбца или строки равен 0, то есть не расширяется, чтобы заполнить пространство.
Чтобы пользовательский интерфейс затем изменил размер, нам нужно дать положительный вес столбцам, которые мы хотели бы расширить. Это делается с использованием методов grid «columnconfigure» и «rowconfigure». Если два столбца имеют одинаковый вес, они будут расширяться с одинаковой скоростью; если один имеет вес 1, другой - 3, последний увеличит три пикселя на каждый пиксель, добавленный к первому.
(выделено мое)
Итак, в этом случае нам нужно внести несколько изменений. Во-первых, нам нужно добавить sticky = "NESW"
к обоим вызовам frame.grid()
и text_widget.grid()
, иначе виджет Text
не будет расширяться за счет полос прокрутки. Во-вторых, нам нужно добавить в программу приведенный ниже фрагмент:
Grid.columnconfigure(root, 0, weight=1)
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(frame, 0, weight=1)
Grid.rowconfigure(frame, 0, weight=1)
Это заканчивается приведенной ниже программой (после внесения некоторых изменений, чтобы я мог запустить приведенный пример):
from tkinter import *
from tkinter import ttk
root = Tk()
frame = ttk.Frame(master=root)
frame.grid(sticky="NSEW")
vbar = ttk.Scrollbar(root, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.grid(row=0, column=1, sticky="NS")
hbar.grid(row=1, column=0, sticky="EW")
text_widget = Text(frame, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.grid(sticky="NSEW")
vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)
Grid.columnconfigure(root, 0, weight=1)
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(frame, 0, weight=1)
Grid.rowconfigure(frame, 0, weight=1)
В качестве примечания, было бы очень просто перестроить эту программу, используя менеджер геометрии Pack
, который (субъективно) более интеллектуален, когда дело доходит до изменения размера виджетов:
from tkinter import *
from tkinter import ttk
root = Tk()
frame = ttk.Frame(master=root)
frame.pack(expand=True, fill="both")
vbar = ttk.Scrollbar(frame, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.pack(side="right", fill="y")
root.update()
hbar.pack(side="bottom", fill="x", padx=vbar.winfo_width())
text_widget = Text(frame, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.pack(expand=True, fill="both")
vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)