向Tkinter Treeview的identify/identify_region传参报错,正确参数是什么?
解决Python2.7 Tkinter Treeview阻止列宽调整时的TclError问题
你遇到的这个报错,根源是版本兼容性:你用的Python2.7(ArcGIS 10.2自带的版本)里的ttk.Treeview并没有identify_region这个方法——这个方法是Python3.4之后才新增的,所以直接调用它会触发Tcl错误。
下面给你适配Python2.7的解决方案,通过计算列的边界位置来判断是否点击了列分隔符,从而阻止手动调整列宽:
修正后的代码示例
首先替换你的点击事件处理函数:
def handle_treeview_single_click(tree, event): # 先判断点击是否在Treeview的头部区域 header_bbox = tree.bbox("header") if not header_bbox: return x_head, y_head, w_head, h_head = header_bbox if not (y_head <= event.y <= y_head + h_head): # 点击的不是头部,直接放行 return # 定义分隔符的检测范围(左右各2像素,可根据需要调整) separator_tolerance = 2 # 处理第一列(默认的#0列) col0_width = tree.column("#0", "width") current_x = 0 sep_start = current_x + col0_width - separator_tolerance sep_end = current_x + col0_width + separator_tolerance if sep_start <= event.x <= sep_end: # 点击了分隔符,终止事件 return 'break' # 处理其他自定义列 for col in tree["columns"]: current_x += col0_width col_width = tree.column(col, "width") sep_start = current_x + col_width - separator_tolerance sep_end = current_x + col_width + separator_tolerance if sep_start <= event.x <= sep_end: return 'break' col0_width = col_width
绑定事件的代码保持不变:
self.tree.bind('<Button-1>', lambda event: handle_treeview_single_click(self.tree, event))
代码逻辑说明
- 头部区域判断:先通过
bbox("header")获取头部的坐标范围,确保只处理点击头部的事件,不影响单元格的点击操作。 - 分隔符位置计算:依次计算每一列的结束位置,把该位置左右
separator_tolerance像素的范围判定为分隔符区域(这里设为2像素,你可以根据实际视觉效果调整)。 - 终止事件:如果点击坐标落在分隔符区域内,返回
'break'来终止事件传递,从而阻止列宽调整。
这个方案完全基于Python2.7 ttk.Treeview支持的方法(bbox、column),不会触发版本兼容错误,同时能实现你需要的“阻止手动调整列宽但保留其他列相关功能”的需求。
内容的提问来源于stack exchange,提问作者Kamakiri




