3

私はPythonを学び始めており、Windows OSの下で、ファイルから別のファイルへのコンバーターを作成することを考えました(たとえば、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. 同じフォルダに別のファイルをコピーしようとしました (ファイル拡張子は同じで、ファイル名に空白はありません)。そのうちの 1 つだけをエントリ ウィジェットにドラッグ アンド ドロップすると、プロセスは正常に開始されます (これは素晴らしいことです)。 !)、しかし、同じフォルダー内の同じ拡張子を持つ他のすべての選択されていないファイルについても継続しますが、エントリウィジェットに複数のファイルをドラッグアンドドロップすると、変換は行われません....

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 に答える