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

时间:2017-07-27 18:25:18

标签: python tkinter treeview tk ttk

由于I can't horizontally scroll Treeview column由于看似Tk / Tkinter的限制,我想让它变粘,因此它会附加到框架上。

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

Note the size of column header.

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

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

其中一个返回值是“separator”。

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

例如:

<Motion>

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

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

>>> 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

答案 1 :(得分:1)

我刚刚找到了一个不错的解决方案。您可以在鼠标单击到达窗口小部件之前捕获它,从而阻止用户修改列宽。

def disableEvent(event):
    return "break"

treeviewName.bind("<Button-1>", disableEvent)

如果你需要真正检查按下了哪个小部件,event.widget包含按下的小部件。

答案 2 :(得分:0)

你可以水平滚动树视图,当我重新调整colomns时(在运行时,向右拖动'关闭屏幕')xscrollbar被激活,调整你的列(更大)创建滚动条和树视图后使用事件的代码,例如按下按钮(例如当树视图填满时),否则'.xview'检测不到任何内容

vsbx = tkinter.Scrollbar(root_search_stock, orient="horizontal")
vsbx.place(x= 40, y = 550, width = 1000)


tree = tkinter.ttk.Treeview(root_search_stock,\
                           columns=column_names,yscrollcommand=vsby.set,xscrollcommand=vsbx.set)
tree.place(x = 50, y = 300)


vsbx.config(command = tree.xview)