在Python(Windows)中拖放多个文件

在Python(Windows)中拖放多个文件,python,file-io,drag-and-drop,tkinter,whitespace,Python,File Io,Drag And Drop,Tkinter,Whitespace,我开始学习Python,我想现在在Windows操作系统下创建一个从一个文件到另一个文件(例如,从png到avi或其他文件扩展名之间)的转换器 我写了一个脚本,它工作得很好,并且完成了转换过程,但是我想在功能上(然后在图形上)改进它;我使用的是Tkinter,我想加载文件时可以拖放它们作为下一个转换命令的输入,而不是打开一个文件夹,在其中放置文件作为“输入源”。我找到了这个主题()并以这种方式使用它: import sys import os import Tkinter from tkdnd_

我开始学习Python,我想现在在Windows操作系统下创建一个从一个文件到另一个文件(例如,从png到avi或其他文件扩展名之间)的转换器

我写了一个脚本,它工作得很好,并且完成了转换过程,但是我想在功能上(然后在图形上)改进它;我使用的是Tkinter,我想加载文件时可以拖放它们作为下一个转换命令的输入,而不是打开一个文件夹,在其中放置文件作为“输入源”。我找到了这个主题()并以这种方式使用它:

import sys
import os
import Tkinter
from tkdnd_wrapper import TkDND
import shlex, subprocess
from subprocess import Popen, PIPE
import glob
import shutil

root = Tkinter.Tk()
dnd = TkDND(root)
entry = Tkinter.Entry()
entry.grid()

def handle(event):
    inputfilespath = event.data
    event.widget.insert(0, inputfilespath)
    filesdir = os.path.dirname(os.path.realpath(inputfilespath))
    files = glob.iglob(os.path.join(filesdir, "*.myext"))
    for inputfilespath in files:
        if os.path.isfile(inputfilespath):
            subprocess1 = subprocess.Popen([...conversion command given as list, not string...], shell=True)
            print "\n\nConversione in corso..."
            subprocess1.wait()
            subprocess1.terminate()
            print "\n\nProcesso terminato!"

dnd.bindtarget(entry, handle, 'text/uri-list')
root.mainloop()
问题是:

  • 若文件名有一个空格,那个么就并没有转换,进程结束时甚至不会通知任何错误。“InputFilePath”希望成为我选择的所有输入文件的通用名称,并且(就我所读的内容而言)我不能(?)对希望包含文件名空白的环境变量使用引号

  • 我尝试在同一文件夹中复制不同的文件(具有相同的文件扩展名,并且文件名中没有空格),如果我在Entry widget上只拖放其中一个文件,该过程将正常启动(这很好!),但对于同一文件夹中具有相同扩展名的所有其他未选定文件,该过程也将继续,然而,如果我在条目小部件上拖放多个文件,则不会发生转换


  • 只需使用tkinter文件对话框,然后让它将文件插入输入框

    例如:

    filedialog = tkFileDialog.askopenfilenames(*options*)
    entry.insert(END, filedialog)
    
    使用StringVar的示例:

    entryVar = StringVar()
    entry = Entry(textvariable=entryVar)
    filedialog = tkFileDialog.askopenfilenames(*options*)
    entryVar.set(filedialog
    

    希望这有帮助

    似乎包含空格的文件名正在用大括号括起来 (Tcl列表样式)。要获得可用的文件列表,您应该能够 比如:

    import Tkinter
    from untested_tkdnd_wrapper import TkDND
    
    
    def handle(event):
        files = root.tk.splitlist(event.data)
    
        for filename in files:
            event.widget.insert('end', filename)
    
    
    root = Tkinter.Tk()    
    lb   = Tkinter.Listbox(root, width=50)
    lb.pack(fill='both', expand=1)
    
    dnd = TkDND(root)
    dnd.bindtarget(lb, handle, 'text/uri-list')
    
    root.mainloop()
    

    只是做了一个快速编辑,因为代码格式出现了错误。它的编写方式也是针对Python2的,因为我假设它是您使用的,但是如果您需要Python3中的一个,请询问,我将发布它…你好,Daniel!非常感谢您的回复!从日期可以看出,我用wxPython解决了自己的问题,但我会记住你的建议:-)谢谢!非常感谢你!我在一个函数上浪费了6个小时,
    root.tk.splitlist