🐍

Python:tkinterdnd2がTcl/Tk 9系で動かないので8系にもどして一時解決

2025/01/20に公開1

https://zenn.dev/takudooon/articles/fee688312b7b88

直面した現象

ひさしぶりにPythonでtkintertkinterdnd2を動かしてみたところ、

下記のようなエラーがでて、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/Tk9系は2024年9月26日にリリースされました。

https://www.tcl.tk/software/tcltk/9.0.html

どうやらtkinterdnd2Tcl/Tk9系では動かないようです。

https://github.com/Eliav2/tkinterdnd2

なのでtcl-tk8系で動かすと正常に動作することがわかりました。

brew install python-tk@3.11

を実行しましょう。すると、デフォルトでTcl/Tk8系がインストールされます。

調査

筆者の環境ではpython 3.13がインストールされていたので、python-tkを下記のコマンドを実行しました。

brew install python-tk@3.13

すると、デフォルトでTcl/Tk9系がインストールされることがわかりました。

この状態で適当なtkinterdnd2をつかったサンプルコードを動作させると、
上述したようなエラーがでました。

そこで、python-tkを削除し、

brew uninstall python-tk@3.13

そして、手元のpythonのバージョンを3.11に下げて、python-tkをインストールしなおしました。

brew install python-tk@3.11

すると、Tcl/Tk8系が同時にインストールされました。

再度、適当なサンプルコードを実行すると上述したエラーがでなくなりました。

おわりに

pythonでtkinterをつかったときtkinterdnd2が動かない現象について対処療法を紹介しました。
今後、アップデートで修正されるかもしれません。
もしくは、tkinterdnd2のソースコードを改良すると簡単に直せるかもしれません。
コードを確認してみたいと思います。

Discussion