Python:tkinterdnd2がTcl/Tk 9系で動かないので8系にもどして一時解決
直面した現象
ひさしぶりにPythonでtkinter
とtkinterdnd2
を動かしてみたところ、
下記のようなエラーがでて、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
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/user/Documents/programming/python/tkinter-drag-and-drop-viewer/main.py", line 106, in <module>
app = MyApp()
File "/Users/user/Documents/programming/python/tkinter-drag-and-drop-viewer/main.py", line 14, in __init__
super().__init__()
~~~~~~~~~~~~~~~~^^
File "/Users/user/Documents/programming/python/tkinter-drag-and-drop-viewer/venv/lib/python3.13/site-packages/tkinterdnd2/TkinterDnD.py", line 287, in __init__
self.TkdndVersion = _require(self)
~~~~~~~~^^^^^^
File "/Users/user/Documents/programming/python/tkinter-drag-and-drop-viewer/venv/lib/python3.13/site-packages/tkinterdnd2/TkinterDnD.py", line 57, in _require
raise RuntimeError('Unable to load tkdnd library.')
RuntimeError: Unable to load tkdnd library.
tkinterdnd2
のパッケージに含まれるTkinterDnD.py
の55行目でエラーが出ています。
tkdnd_Init
のシンボルが見つからないため、
TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd')
の実行に失敗したようです。
動作環境
- Macbook M3
- python
- 3.13
- python-tk@3.13
- tcl-tk
- 9.0.1
- python-tk@3.13をインストールすると自動でインストールされます
- tkinterdnd2
- 0.4.2
結論
Tcl/Tk
9系は2024年9月26日にリリースされました。
どうやらtkinterdnd2
はTcl/Tk
9系では動かないようです。
なのでtcl-tk
8系で動かすと正常に動作することがわかりました。
brew install python-tk@3.11
を実行しましょう。すると、デフォルトでTcl/Tk
8系がインストールされます。
調査
筆者の環境ではpython 3.13がインストールされていたので、python-tk
を下記のコマンドを実行しました。
brew install python-tk@3.13
すると、デフォルトでTcl/Tk
9系がインストールされることがわかりました。
この状態で適当なtkinterdnd2
をつかったサンプルコードを動作させると、
上述したようなエラーがでました。
そこで、python-tk
を削除し、
brew uninstall python-tk@3.13
そして、手元のpythonのバージョンを3.11に下げて、python-tk
をインストールしなおしました。
brew install python-tk@3.11
すると、Tcl/Tk
8系が同時にインストールされました。
再度、適当なサンプルコードを実行すると上述したエラーがでなくなりました。
おわりに
pythonでtkinter
をつかったときtkinterdnd2
が動かない現象について対処療法を紹介しました。
今後、アップデートで修正されるかもしれません。
もしくは、tkinterdnd2
のソースコードを改良すると簡単に直せるかもしれません。
コードを確認してみたいと思います。
Discussion
Tcl/tk 9系でも動かす方法、理解した。
そういうことか...!