Python Tkinter Treeview选中节点获取完整文件绝对路径的问题求解
解决方案
你当前的实现仅读取了选中项的直接父节点名称,没有追溯到根节点,且仅存储了目录的路径信息,未覆盖文件节点,以下是两种可行实现方案:
方案一:节点插入时预存绝对路径(推荐)
该方案性能更高,无需双击时逐层遍历节点层级,仅需修改两处代码:
- 修改
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')
- 修改
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
相关产品推荐
相关产品推荐

