如何禁用手动调整Tkinter的Treeview列的大小?

Doo*_*890 4 python treeview tk-toolkit tkinter ttk

由于看起来像Tk/Tkinter限制,我不能水平滚动Treeview列,我想让它粘,所以它附加到帧.

问题是用户可以手动调整Treeview列的大小,这可能会以某种方式搞乱我的界面.是否可以禁用此类功能?

请注意列标题​​的大小.

请注意列标题​​的大小.

用户可以拖动鼠标来调整列大小. 我想禁用它.

用户可以拖动鼠标来调整列大小.我想禁用它.

设置minwidth为某个值可防止列收缩,但仍可以将其调整为更大的宽度.我想我可以对改变宽度做出反应并将其恢复原状,但必须有更好的方法来做到这一点.

jed*_*rds 8

以下仅在Windows上进行了测试,其他操作系统可能会有所不同.

对于任何未来的读者,从Tk 8.5开始,Treeviews有一个identify_region接受屏幕位置(x,y)的方法,并返回一个字符串,该字符串对应于那些坐标占据的树视图区域.

其中一个返回值是"分隔符".

我已经使用它来捕获分隔符上的双击事件以自动调整列,但您也可以使用它来捕获单击事件并阻止它们.

例如:

def handle_click(event):
    if treeview.identify_region(event.x, event.y) == "separator":
        return "break"

#...

treeview.bind('<Button-1>', handle_click)
Run Code Online (Sandbox Code Playgroud)

这样做的好处是不会禁用整个树视图 - 因此您仍然可以选择/展开/折叠行,单击列标题进行排序等等 - 您将无法调整列的大小.

请注意,即使禁用了调整大小,仍会出现"双箭头"光标(⇔).您还可以通过对<Motion>事件执行完全相同的操作来阻止双箭头光标显示(绑定到它,检查它是否在分隔符上方,并通过返回字符串来停止传播事件"break").

>>> sys.version
'3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)]'
>>> tkinter.TkVersion
8.6
Run Code Online (Sandbox Code Playgroud)