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

Python Tkinter Treeview选中节点获取完整文件绝对路径的问题求解

解决方案

你当前的实现仅读取了选中项的直接父节点名称,没有追溯到根节点,且仅存储了目录的路径信息,未覆盖文件节点,以下是两种可行实现方案:


方案一:节点插入时预存绝对路径(推荐)

该方案性能更高,无需双击时逐层遍历节点层级,仅需修改两处代码:

  1. 修改insert_node方法,插入所有节点(含文件、目录)时将绝对路径存入节点的自定义属性中:
def insert_node(self, parent, text, abspath):
    # 插入节点时将绝对路径存入values参数,后续可直接读取
    node = self.tree.insert(parent, 'end', text=text, open=False, values=(abspath,))
    if os.path.isdir(abspath):
        self.nodes[node] = abspath
        self.tree.insert(node, 'end')
  1. 修改OnDoubleClick方法,直接读取预存的绝对路径:
def OnDoubleClick(self, event):
    item = self.tree.selection()[0]
    # 直接取出节点存储的绝对路径
    path = self.tree.item(item, 'values')[0]
    
    if os.path.isfile(path):
        print("file:", path)
        submit_file(os.path.basename(path))
    else:
        print("dir:", path)

方案二:双击时递归拼接路径(无需修改插入逻辑)

如果你不想改动原有节点插入的逻辑,可以在双击事件中递归遍历所有父节点直到根节点,拼接出完整路径:

def OnDoubleClick(self, event):
    item = self.tree.selection()[0]
    path_parts = []
    current_node = item
    # 向上遍历所有父节点,收集每一级的名称
    while current_node:
        path_parts.insert(0, self.tree.item(current_node)['text'])
        current_node = self.tree.parent(current_node)
    # 拼接为系统兼容的完整路径
    path = os.path.join(*path_parts)
    
    if os.path.isfile(path):
        print("file:", path)
        submit_file(os.path.basename(path))
    else:
        print("dir:", path)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:54:03