【问题标题】:Drag-and-Drop multiple files in Python (Windows)在 Python 中拖放多个文件 (Windows)
【发布时间】:2013-10-28 14:45:42
【问题描述】:

我开始学习 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. 如果文件名有空格,则不进行转换,进程结束,甚至没有通知任何错误。 “inputfilespath”希望成为我选择的所有输入文件的通用名称,并且(对于我阅读的内容)我不能(?)对希望包含文件名空格的环境变量使用引号......

  2. 我尝试在同一个文件夹中复制不同的文件(具有相同的文件扩展名且文件名中没有空格),如果我仅将其中一个拖放到 Entry 小部件上,则该过程开始很好(这很棒!),但它也适用于同一文件夹中具有相同扩展名的所有其他未选择文件,而如果我在条目小部件上拖放多个文件,则不会发生转换.. ..

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!我在那个函数上浪费了 6 个小时,root.tk.splitlist
    【解决方案2】:

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

    例子:

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

    使用 StringVar 的示例:

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

    希望这会有所帮助!

    【讨论】:

    • 刚刚做了一个快速编辑,因为代码格式错误。
    • 它的编写方式也是为 Python 2 编写的,因为我认为它是您使用的,但如果您在 python 3 中需要一个,请询问,我会发布它...
    • 你好丹尼尔!非常感谢您的回复!正如您从日期中看到的那样,然后我使用 wxPython 解决了自己,但我会记住您的建议 :-) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多