You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter TreeView:如何在<ButtonPress-1>事件获取光标下的项

解决TreeView鼠标按下时获取当前项的问题

在ButtonPress-1事件触发时,TreeView的selection()返回的是之前选中的项,而非当前鼠标点击的项——因为TreeView默认的选中逻辑是在鼠标释放后才更新选中状态。要获取按下瞬间光标所在的项,可通过以下方式实现:

核心方法:identify_row()

TreeView内置了identify_row(y)方法,传入鼠标在组件内部的垂直坐标,就能返回对应行的唯一ID。直接使用事件对象的event.y即可,它本身就是相对于TreeView组件的坐标,无需额外转换屏幕坐标。

修改后的完整代码

import tkinter as tk
from tkinter import ttk

def main() -> None:
    root = tk.Tk()
    root.title('Tree coords')

    tree = ttk.Treeview(root, height=30, show='headings')
    tree.grid(row=0, column=0, sticky=tk.NSEW)
    tree.bind("<ButtonPress-1>", on_start)

    # 修正列定义:columns仅需列名列表,宽度单独设置
    col_list = ('Names',)
    tree['columns'] = col_list
    tree.column('Names', width=100)
    tree.heading('Names', text='Names')

    for name in ['ab', 'ef', 'mn']:
        tree.insert('', 'end', values=(name,))

    root.mainloop()

def on_start(event=None):
    widget = event.widget
    # 获取当前点击行的ID
    row_id = widget.identify_row(event.y)
    
    if row_id:  # 判断是否点击了有效行(非空白区域)
        current_item = widget.item(row_id)
        print(f"坐标:({event.x}, {event.y}),当前项ID:{row_id},内容:{current_item['values']}")
    else:
        print("点击了TreeView空白区域")

if __name__ == '__main__':
    main()

关键说明

  • event.y直接提供鼠标在TreeView内部的垂直位置,无需转换屏幕坐标
  • identify_row(event.y)返回当前行的ID,点击空白区域时返回空字符串
  • 通过widget.item(row_id)可获取该行的完整数据,包括values、text等属性

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:22:08