【问题标题】:Get full path of selected file获取所选文件的完整路径
【发布时间】:2021-12-08 23:35:20
【问题描述】:

我有一个文件夹中的树状结构,我想在单击一个文件时打开该文件。

一切正常,但是当我单击文件时,它不会向我发送正确的路径

import os
import platform
import subprocess
import tkinter as tk
import tkinter.ttk as ttk



class App(tk.Frame):
    def openfolderfile(self,filename2open):
        if platform.system() == "Windows":
            os.startfile(filename2open)
        elif platform.system() == "Darwin":
            subprocess.Popen(["open", filename2open])
        else:
            subprocess.Popen(["xdg-open", filename2open])


    def select(self):
        for i in self.tree.selection():
            print("".join([str(self.tree.item(i)['text'])]))
            print(os.path.abspath("".join([str(self.tree.item(i)['text'])])))
           # self.openfolderfile()

    def __init__(self, master, path):
        tk.Frame.__init__(self, master)
        self.tree = ttk.Treeview(self)
        ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
        xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
        self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
        self.tree.heading('#0', text=path, anchor='w')

        abspath = os.path.abspath(path)
        root_node = self.tree.insert('', 'end', text=abspath, open=True)
        self.process_directory(root_node, abspath)

        self.tree.grid(row=0, column=0,ipady=200,ipadx=200)
        ysb.grid(row=0, column=1, sticky='ns')
        xsb.grid(row=1, column=0, sticky='ew')
        self.grid()
        self.tree.bind("<Double-Button>", lambda e: self.select())




    def process_directory(self, parent, path):
        for p in os.listdir(path):
            abspath = os.path.join(path, p)
            isdir = os.path.isdir(abspath)
            oid = self.tree.insert(parent, 'end', text=p, open=False)
            if isdir:
                self.process_directory(oid, abspath)






root = tk.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))
root.title("Success ")


app = App(root, path="Reports/")
app.mainloop()

这是它打印的内容:

/Users/myuser/PycharmProjects/OCP/Notas.txt

真正的路径是:

/Users/myuser/PycharmProjects/OCP/Reports/rep1/Notas.txt

为什么会这样?

【问题讨论】:

    标签: python python-3.x path


    【解决方案1】:

    为您的 select 函数尝试这样的操作:

    def select(self):
        for i in self.tree.selection():
            print("".join([str(self.tree.item(i)['text'])]))
    
            full_path = ''
            current_iid = i
    
            while True:
                # get next parent directory
                parent_iid = self.tree.parent(current_iid)
                attach_path = self.tree.item(parent_iid)['text']
    
                # change the parent identifier to be the current now
                current_iid = parent_iid
    
                # break if the path is empty and thus no more parents are available
                if attach_path == '':
                    break
    
                # add found path to the full path
                full_path = os.path.join(attach_path, full_path)
    
            print(os.path.join(full_path, ("".join([str(self.tree.item(i)['text'])]))))
    

    你的实现的问题是,你使用了os.path.abspath,这给了你当前的工作目录,而不是所选文件所在的目录。

    【讨论】:

    • 几乎,它仍然缺少报告文件夹:s
    • 是的,你是对的!我更新了我的答案,它现在迭代地通过父目录并返回完整路径。
    • 你的权利 :),现在知道了,谢谢
    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2016-03-31
    • 2012-10-19
    相关资源
    最近更新 更多