You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

代码逻辑说明

  1. 头部区域判断:先通过bbox("header")获取头部的坐标范围,确保只处理点击头部的事件,不影响单元格的点击操作。
  2. 分隔符位置计算:依次计算每一列的结束位置,把该位置左右separator_tolerance像素的范围判定为分隔符区域(这里设为2像素,你可以根据实际视觉效果调整)。
  3. 终止事件:如果点击坐标落在分隔符区域内,返回'break'来终止事件传递,从而阻止列宽调整。

这个方案完全基于Python2.7 ttk.Treeview支持的方法(bboxcolumn),不会触发版本兼容错误,同时能实现你需要的“阻止手动调整列宽但保留其他列相关功能”的需求。

内容的提问来源于stack exchange,提问作者Kamakiri

火山引擎 最新活动