🐍
Python:tkinterdnd2がTcl/Tk 9系で動かせた
はじめに
こちらの続きになります。
前回は、pythonとpython-tkのバージョンを下げることで、Tcl/Tk8系でtkinterdnd2を動かせるようになりました。
その後、さらに調べたところ、tkinterdnd2がTcl/Tk9系で動かせました。
解決方法
python-tk@3.13でtkinterdnd2を動かしたところ、下記のようなエラーが出ていました。
raceback (most recent call last):
File "/Users/user/Documents/programming/python/tkinter-drag-and-drop-viewer/venv/lib/python3.13/site-packages/tkinterdnd2/TkinterDnD.py", line 55, in _require
TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd')
_tkinter.TclError: cannot find symbol "tkdnd_Init": dlsym(0x6b631950, tkdnd_Init): symbol not found
パッケージに含まれるTkinterDnD.pyの55行目でエラーがでていました。
こちらのコマンドを実行したとき、
TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd')
tkinterdnd2/tkdnd/osx-arm64ディレクトリの中で動的ライブラリファイルlibtkdnd2.9.3.dylibが読み込まれます。このとき、tkdnd_Initのシンボルが見つからないことが原因のようです。

もしかして、このdylibファイルが古いため、Tcl/Tk9系に対応していないのでは?、と考えました。そこで、tkdndのリポジトリを確認してみることにしました。
すると、最新のリリースを確認するとdlibファイルの最新バージョンは2.9.5でした。
下記のリンクから、tkdnd-2.9.5-macOS-tcl9.0-arm64-x64-14.2.1.tgzをダウンロードして解凍します。

解凍したファイルを先ほどのtkinterdnd2/tkdnd/osx-arm64ディレクトリにコピーして置換します。

その後、pythonを3.13に戻して、python-tk@3.13をインストールしなおします。
# 古いバージョンをアンインストール
brew uninstall python-tk@3.11
# python-tk@3.13をインストール
brew install python-tk@3.13
これでtkinterdnd2をTcl/Tk9系で動かすことができました。
おわりに
何事もバージョンアップがあると要注意ですね。
Discussion