🐍

Python:tkinterdnd2がTcl/Tk 9系で動かせた

2025/01/20に公開

はじめに

こちらの続きになります。

https://zenn.dev/takudooon/articles/7793b624d104c7

前回は、pythonとpython-tkのバージョンを下げることで、Tcl/Tk8系でtkinterdnd2を動かせるようになりました。
その後、さらに調べたところ、tkinterdnd2Tcl/Tk9系で動かせました。

解決方法

python-tk@3.13tkinterdnd2を動かしたところ、下記のようなエラーが出ていました。

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のリポジトリを確認してみることにしました。

https://github.com/petasis/tkdnd

すると、最新のリリースを確認するとdlibファイルの最新バージョンは2.9.5でした。
下記のリンクから、tkdnd-2.9.5-macOS-tcl9.0-arm64-x64-14.2.1.tgzをダウンロードして解凍します。

https://github.com/petasis/tkdnd/releases

解凍したファイルを先ほどの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

これでtkinterdnd2Tcl/Tk9系で動かすことができました。

おわりに

何事もバージョンアップがあると要注意ですね。

Discussion