Skip to content
Advertisement

How to disable manual resizing of Tkinter’s Treeview column?

Since I can’t horizontally scroll Treeview column due to what appears to be Tk/Tkinter limitation, I want to make it sticky so it is attached to the frame.

The issue is that user can manually resize Treeview column which can mess up my interface in a certain way. Is it possible to disable such functionality?

Note the size of column header.

Note the size of the column header.

User can drag mouse to resize column. I want to disable this.

User can drag mouse to resize column. I want to disable this.

Setting minwidth to a certain value prevents column from shrinking, but it is still possible to resize it to a larger width. I suppose I can react to changing width and just revert it to original, but there has to be a better way to do it.

Advertisement

Answer

The following has only been tested on Windows, other OS’s may vary.

For any future readers, since Tk 8.5, Treeviews have an identify_region method that accepts a screen position (x,y) and will return a string corresponding to the region of the treeview those coordinates occupy.

One of the return values is “separator”.

I’ve used this to catch double-click events on the separator to auto-size columns, but you could also use it to catch single-click events and block them.

For example:

JavaScript

This has the advantage of not rendering the entire treeview disabled — so you can still select/expand/collapse rows, click column headings to sort, etc — you just won’t be able to resize the columns.

Note that even though resizing is disabled, the “double arrow” cursor (⇔) will still appear. You could additionally prevent the double arrow cursor from showing by doing the exact same thing with the <Motion> event (binding to it, checking if it’s above a separator, and stopping the event from being propagated by returning the string "break").

JavaScript
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement