🐍
Python:tkinterdnd2がTcl/Tk 9系で動かせた
はじめに
こちらの続きになります。
前回は、pythonとpython-tk
のバージョンを下げることで、Tcl/Tk
8系でtkinterdnd2
を動かせるようになりました。
その後、さらに調べたところ、tkinterdnd2
がTcl/Tk
9系で動かせました。
解決方法
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/Tk
9系に対応していないのでは?、と考えました。そこで、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/Tk
9系で動かすことができました。
おわりに
何事もバージョンアップがあると要注意ですね。
Discussion