TkinterでGUIを作成しています。
ドラッグアンドドロップを実装したくて、Tkinterednd2を使いましたが、上手くパスが取得されないというバグがありました。
具体的にはこんな感じ

先頭と末尾に{}がつくのと、スラッシュ(/)がバックスラッシュ(\)になってしまっています。パスに日本語が含まれていることが原因かなと思いましたが、発生するときとしないときがあるので発生条件は不明。
根本的な解決ではないですが、とりあえず{}と\がパスに現れたら変換してしまえばいいので、そのような関数を組み込みます。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from tkinter import * | |
from tkinterdnd2 import * | |
# パス修正用関数 | |
def dnd_fix(var): | |
filename = var.get() | |
print('before:' + filename) | |
# 文字列をrawに変換 | |
filename_new = repr(filename)[1:-1] | |
# \と{}を修正 | |
fix = filename_new.replace('\\\\', '/').replace('{', '').replace('}', '') | |
print('after:' + fix) | |
var.set(fix) | |
def droped(event): | |
var.set(event.data) | |
dnd_fix(var) | |
# メインウィンドウ | |
root = TkinterDnD.Tk() | |
root.title('tkinterdnd2_fix') | |
root.geometry('500x200') | |
# Lavel | |
label = Label(root, text='Folder Path') | |
label.pack(side=TOP, anchor=W, padx=(10, 0), pady=10) | |
# Entry | |
var = StringVar() | |
entry = Entry(root, textvar=var, width=80) | |
entry.drop_target_register(DND_FILES) | |
entry.dnd_bind('<<Drop>>', droped) | |
entry.pack(side=TOP, anchor=W, padx=(10, 0), pady=10) | |
root.mainloop() |
Entryにドロップされたパスに対して、{}があったら削除し、\があったら/に変換して、Entryに挿入し直すだけです。
注意点として、元々のファイル名に{}が含まれている場合、そちらも削除してしまいます。