Tkinterdnd2でパスに{} やバックスラッシュが入るバグの対処法

Python

TkinterでGUIを作成しています。

ドラッグアンドドロップを実装したくて、Tkinterednd2を使いましたが、上手くパスが取得されないというバグがありました。

具体的にはこんな感じ

先頭と末尾に{}がつくのと、スラッシュ(/)がバックスラッシュ(\)になってしまっています。パスに日本語が含まれていることが原因かなと思いましたが、発生するときとしないときがあるので発生条件は不明。

根本的な解決ではないですが、とりあえず{}と\がパスに現れたら変換してしまえばいいので、そのような関数を組み込みます。

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に挿入し直すだけです。

注意点として、元々のファイル名に{}が含まれている場合、そちらも削除してしまいます。

Python
スポンサーリンク
Haoxhpoをフォローする
能動ブログ
タイトルとURLをコピーしました