如何从tkinterDND2事件对象正确获取文件路径

时间:2018-08-15 05:53:01

标签: python user-interface tkinter

我正在尝试在python中使用tkinter在一个简单的GUI应用程序中实现“将文件放在此处”功能

它使用TkinterDnD2,最终看到此stackoverflow answer

删除文件event.data时,将返回用大括号括起来的文件名

示例:{d:/test/sample1.pdf}

但是,当将多个文件放入目标中时,每个路径都用花括号包围

示例:{D:/test/sample1.pdf} {D:/test/sample2.pdf}

如何从该字符串正确解析文件路径?

2 个答案:

答案 0 :(得分:1)

我不确定TkinterDnD2库将返回单个字符串中的路径流还是返回字符串中的单个路径。

如果它是字符串中的单个路径,则解决方法很简单:

>>> str1="{mypath/to/file}"
>>> str1[1:-1]

输出应为

'mypath/to/file'

但是我想您的问题是多个路径以单个字符串形式出现。您可以实现以下代码。

将str1视为具有多个路径的字符串:

str1="{mypath1/tofile1}{mypath3/tofile3}{mypath2/tofile2}"
i=0
patharr=[]
while(str1.find('{',i)>=0):
    strtIndex=str1.find('{',i)
    if(str1.find('}',strtIndex+1)>0):
        endIndex=str1.find('}',strtIndex+1)
        patharr.append(str1[strtIndex+1:endIndex])
        print(str1[strtIndex:endIndex+1])
        i=endIndex+1
print(patharr)

现在输出如下:

  

['mypath1 / tofile1','mypath3 / tofile3','mypath2 / tofile2']

因此,根据您在下面的评论中的问题,是文件路径中带有花括号的文件路径的代码。

str1 = "{mypath}}}}1/tofil{{{e1}{mypath3/tofile3}{mypath2/tofile2}}}}}}"
i = 0
patharr = []
while (str1.find('{', i) >= 0):
    strtIndexfirst = str1.find('{', i)
    notFound = True
    strtIndex = strtIndexfirst
    while (notFound and strtIndex < len(str1)):

        if (str1.find('}', strtIndex + 1) > 0):
            findInd = str1.find('}', strtIndex + 1)

            if (findInd == len(str1) - 1):
                endIndex = str1.find('}', strtIndex + 1)
                patharr.append(str1[strtIndexfirst + 1:endIndex])
                print(str1[strtIndex:endIndex + 1])
                i = endIndex + 1
                break
            if (str1[findInd + 1] == '{'):
                endIndex = str1.find('}', strtIndex + 1)
                patharr.append(str1[strtIndexfirst + 1:endIndex])
                print(str1[strtIndex:endIndex + 1])
                i = endIndex + 1

                notFound = False
            else:
                strtIndex = findInd
        else:
            strtIndex = str1.find('}', strtIndex + 1)

print(patharr)

对于上述字符串输出是

  

['mypath}}}} 1 / tofil {{{e1','mypath3 / tofile3','mypath2 / tofile2}}}}}'')

如果str1是

str1="{{{mypath1/tofil}}e1}{mypath3/tofile3}{mypath2/tofile2}}}}}}"

输出为

  

['{{mypath1 / tofil}} e1','mypath3 / tofile3','mypath2 / tofile2}}}}}''

也可以解决其他测试用例。这段代码运行良好。

答案 1 :(得分:1)

使用以下两行python代码可以轻松实现:

temp = filePathsReturned[1:-1]
list = temp.split("} {")