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
相关产品推荐
相关产品推荐

