Background
Python-2.7.14 x64, Tk-8.5.15 (included)
It is well documented that the Treeview widget in Tk has many problems, and Tkinter, being a thin shell, can not cope with them. A common problem is that Treeview mode in browse mode works correctly with a horizontal scrollbar. To set the width of a common tree, you need to set the width of each column. But if you have many columns, this stretches the parent container horizontally and does not activate the horizontal scroll bar.
The solution I found during development for each column sets the width desired size you want, and cache this value somewhere in safety. When you add, edit or delete a row, you need to go around the columns and ask for their current width value, and if it is larger than your cached width, set width back to the original cached value, and also set minwidth to the current column width. The last column requires its stretch property to be set to "True", so it can absorb the remaining space. This activates the horizontal scrollbar and allows it to appropriately pan the contents of the Treeview without changing the width of the overall widget.
Warning. At some point, Tk internally resets width to minwidth , but does not force redraw. You will be surprised later when you change the widget, for example, by adding or removing a row, so you need to repeat this every time you change the widget. This is not a big problem if you catch all the places where redrawing can occur.
Problem
Changing the Ttk style property causes the entire application to be redrawn, so the pop-up warning that I mentioned above, the Treeview widget expands horizontally, and the horizontal scrollbar is deactivated.
Step by step
The code below demonstrates:
The resulting window will look something like this:

Note that the horizontal scrollbar is active and that there is a slight overflow of the last column outside the edge of the widget. The last two calls to tv.column is what allows this, but resetting the column properties of the last column, we see that Tk quietly updated the width and minwidth to be the same:
tv.column("value") {'minwidth': 372, 'width': 372, 'id': 'value', 'anchor': u'w', 'stretch': 1}
Changing any property of any style will force the widget to be redrawn. For example, the following line sets the foreground color to red for a derived class of the Checkbutton style:
s.configure("Foo2.TCheckbutton", foreground="red")
Now this is the Treeview widget:

Now the problem is to reduce the entire widget back. The last column can be returned to its original size by setting width to its original cached size, stretch to "False" and minwidth to the maximum size of the column:
tv.column("value", width=232, stretch=False, minwidth=372)

But the width of the Treeview widget did not decrease.
I found two possible solutions, both in binding to the <Configure> event, using the last display column:
Indicate the change in topics:
tv.column("value", width=232, stretch=True, minwidth=372) tv.event_generate("<<ThemeChanged>>")
Hide and re-show:
tv.grid_remove() tv.column("value", width=232, stretch=True, minwidth=372) tv.grid()
Both work because they are the only ways I can find to call the Tk TtkResizeWidget() internal function. The first one works because <<ThemeChanged>> forces a complete recalculation of the widget geometry, and the second one works because TtkResizeWidget() will call TtkResizeWidget() if it is in the unchanged state when the column is reconfigured.
The disadvantage of both methods is that you can sometimes see how the window expands for one frame and then shrinks. That is why I consider it both non-optimal and hoping that someone else knows about a better approach. Or at least a related event that happens either before <Configure> , or before the extension happens, from which I can use one of the methods above.
Some links indicating that this is a problem in Tk for long :
- Problems with Treeview with horizontal scrollbar on Tcl Wiki (search
[ofv] 2009-05-30 ). - Ticket # 3519160 .
- The message on the Tkinter mailing list is to discuss.
And the problem: it still plays on Python-3.6.4, including Tk-8.6.6.