3

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

我写了一个运行良好的脚本,它完成了转换过程,但我想在功能上改进它(然后在图形上);我正在使用 Tkinter,我想加载文件时可以拖放它们作为下一个转换命令的输入,而不是打开一个文件夹,将文件作为“输入源”放入其中。我找到了这个主题(python 将资源管理器文件拖放到 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()

问题:

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

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

4

2 回答 2

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()
于 2014-07-04T02:31:51.770 回答
1

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

例子:

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

使用 StringVar 的示例:

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

希望这可以帮助!

于 2014-07-03T06:54:05.990 回答