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

时间:2013-10-19 22:47:57

标签: python file-io drag-and-drop tkinter whitespace

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

我编写了一个可以正常运行的脚本,它完成了转换过程,但我希望在功能上进行改进(然后在图形中);我正在使用Tkinter,我想加载文件,可以将它们拖放为下一个转换命令的输入,而不是打开一个文件夹,将文件作为“输入源”。我找到了这个主题(python drag and drop explorer files to tkinter entry widget)并且我以这种方式使用它:

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()

问题:

  1. 如果filename有空格,则没有转换,并且进程结束甚至没有通知任何错误。 “inputfilespath”想要成为我选择的所有输入文件的通用名称,并且(对于我读到的内容)我不能(?)使用引号来表示希望包含文件名空格的环境变量......

  2. 我尝试在同一文件夹中复制不同的文件(具有相同的文件扩展名,没有空格到文件名中),如果我只在Entry小部件中拖放其中一个,则进程启动很好(这很棒!),但它也会继续在同一文件夹中具有相同扩展名的所有其他未选文件,而如果我在Entry小部件上拖放多个文件,则不会发生转换。 ..

2 个答案:

答案 0 :(得分:2)

似乎包含空格的文件名被包裹在大括号中 (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()

答案 1 :(得分:1)

只需使用tkinter文件对话框,然后将文件插入输入框即可。

示例:

filedialog = tkFileDialog.askopenfilenames(*options*)
entry.insert(END, filedialog)

使用StringVar的示例:

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

希望这有帮助!