質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

9755閲覧

Python3 Tkinter ドラッグアンドドロップ機能をexeファイルで使いたい

person

総合スコア224

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

1クリップ

投稿2020/09/21 01:16

編集2020/09/24 00:38

前にTkinterでドラッグアンドドロップの機能を使えるように必要なファイルをダウンロードしました。
Python3 Tkinter ドラッグアンドドロップ用のライブラリでエラーが起こる

pyファイルでは実行できたのですが、exe化したら実行できませんでした。

  1. noconsoleでexe化

(1) pyinstaller --noconsole --onefile dnd.py
(2) dnd.exeをdnd.pyと同じ位置へ移動(多分意味ないとは思うが念のため)
(3) 下図のエラー
イメージ説明

  1. noconsoleなしでexe化

(1) pyinstaller --onefile dnd.py
(2) dnd.exeをdnd.pyと同じ位置へ移動(多分意味ないとは思うが念のため)
(3) 下図のエラー
イメージ説明

実行ファイルにしても使用できるようにするにはどうすればいいでしょうか?
main.specをいじってpyinstallerで再び実行ファイルにすればいいのでしょうか?

また、今回のドラッグアンドドロップ機能に関しては、実行ファイルにしたときは特にライブラリをインストールしたりパスを通す必要はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/09/21 01:18

実行できないとはどうなるんでしょうか。 エラーが出るなら、エラーメッセージを提示しましょう
person

2020/09/24 00:42

追記しました。
guest

回答1

0

ベストアンサー

自分の環境 (python3.8/win10) では、pyinstaller に特に何も指定する必要が無く
Drag and Drop の機能は動いてますが、ライブラリは別の場所からインストールしました。

ライブラリを自分でダウンロードして、プロジェクト下に配置する場合は、
必要なファイルを調べ、コマンドライン引数かspecファイルで含めるようにして、
実行するプログラムからも参照できるように構成する必要があります。

実行ファイルにしても使用できるようにするにはどうすればいいでしょうか?
main.specをいじってpyinstallerで再び実行ファイルにすればいいのでしょうか?
実行ファイルにしたときは特にライブラリをインストールしたりパスを通す必要はないでしょうか?

何れについても、プロジェクトの構成次第なので、
問題を再現できる環境構築~実行ファイル作成迄の手順等の情報が必要です。


まずは、こちらからドラッグ&ドロップのライブラリのインストールを試してみてはどうでしょう。
ライブラリ内容は同じ(versionは異なるかもしれません)ですが、tkdndもパッケージ内に含まれていて、
READMEの末尾にpyinstaller について言及があります。

Github TkInterDnD2

pyinstaller

If you want to use pyinstaller, you should use the hook-tkinterdnd2.py file included. Copy it in the base directory of your project, then:

cmd

1pyinstaller -F -w myproject/myproject.py --additional-hooks-dir=.

投稿2020/09/21 21:10

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

person

2020/10/01 07:14

TkinterDnD2をgithubにあるものに変えても同じでした。 sys.stderr をdnd.pyに入れてexeファイルを実行したら Traceback (most recent call last): File "TkinterDnD2\TkinterDnD.py", line 50, in _require TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd') _tkinter.TclError: can't find package tkdnd During handling of the above exception, another exception occurred: Traceback (most recent call last): File "dnd.py", line 14, in <module> root = TkinterDnD.Tk() File "TkinterDnD2\TkinterDnD.py", line 282, in __init__ self.TkdndVersion = _require(self) File "TkinterDnD2\TkinterDnD.py", line 52, in _require raise RuntimeError('Unable to load tkdnd library.') RuntimeError: Unable to load tkdnd library. と表示されました。
person

2020/10/01 07:18

pyinstaller -F -w myproject/myproject.py --additional-hooks-dir=. については、myproject/myproject.py の部分をdnd.exeの絶対パスに変えましたが、同様のstderrでした。 dir= の後にはTkinterDnDのディレクトリを指定すればよいのでしょうか?
teamikl

2020/10/01 11:03

確認ですが、READMEに書かれている方法でインストールしましたか? まずは、インストールした場所にファイルが有るか確認してみてください。 >dir= の後にはTkinterDnDのディレクトリを指定すればよいのでしょうか? you should use the「hook-tkinterdnd2.py」 file included. Copy it in the base directory of your project, then: ここでプロジェクトへコピーしてと書かれているのは、 hook-tkinterdnd2.py というファイルです。 --additional-hooks-dir にはこの スクリプトがあるディレクトリを指定します。 上の説明では、プロジェクトのルートディレクトリ(pyinstaller のコマンドを実行する場所) にコピーしてカレントディレクトリを指定してます。
person

2020/10/06 02:23

すみません。README.mdに書かれている方法とあっているかわからないのですが・・・。 現段階でやったこと 1. githubのCodeにあるDownload.ZIPからtkinterdnd2-masterをダウンロード 2. コマンドプロンプトでcd ./tkinterdnd2-master へ移動して python setup.py install。tkinterdnd2-masterフォルダの中にtkinterdnd2_pmgagne.egg-infoフォルダとdistフォルダとbuildフォルダが生成された。 (ここで確認のため自作サンプルプログラムdnd.pyを走らせようとしたら、インポートモジュールの名前が違った。今までのやつは"TkinterDnD2"だったが、githubから落としたフォルダ名は"tkinterdnd2"だった。フォルダ名とソースコードのimport文のどっちを変えればいいかわからない。)
teamikl

2020/10/06 02:59 編集

READMEより > You can then import tkinterdnd2 in your project. See examples in folder "demos". import tkinterdnd2 として使います。 demoフォルダ内にサンプルコードがあるので参考にして見て下さい。
person

2020/10/06 07:53

demo_canvas.pyをtkinterdnd2-master直下にコピーして実行しましたが、エラーが出てしまいました。 PS C:\Users\USER> & python c:/Users/USER/Desktop/tkinterdnd2-master/demo_canvas.py Traceback (most recent call last): File "c:\Users\USER\Desktop\tkinterdnd2-master\tkinterdnd2\TkinterDnD.py", line 53, in _require TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd') _tkinter.TclError: couldn't load library "c:\Users\USER\Desktop\tkinterdnd2-master\tkinterdnd2\tkdnd\win64/libtkdnd2.9.2.dll": Bad exe format. Possibly a 32/64-bit mismatch. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "c:/Users/USER/Desktop/tkinterdnd2-master/demo_canvas.py", line 10, in <module> root = tkinterdnd2.Tk() File "c:\Users\USER\Desktop\tkinterdnd2-master\tkinterdnd2\TkinterDnD.py", line 285, in __init__ self.TkdndVersion = _require(self) File "c:\Users\USER\Desktop\tkinterdnd2-master\tkinterdnd2\TkinterDnD.py", line 55, in _require raise RuntimeError('Unable to load tkdnd library.') RuntimeError: Unable to load tkdnd library. tkdnd library とは C:\Users\USER\AppData\Local\Programs\Python\Python38-32\tcl に入れたtkdndフォルダ内のファイル群のことでしょうか。
teamikl

2020/10/06 08:24 編集

場所はインストール環境によるので何処にあるか解りませんが、 エラーは Bad exe format. Possibly a 32/64-bit mismatch. とあるので、Python が 32 bit 版ですか? 付属のdll はフォルダ名にwin64とあるように64bit版です。 READMEのリンクにある In this project we use the pre-compiled release from https://github.com/petasis/tkdnd/releases/tag/tkdnd-release-test-v2.9.2 and copy them in tkinterdnd2/tkdnd. のリンクから x86 をダウンロードしてファイルを差し替えでみてはどうでしょう? (win64フォルダ内に32用のdllを入れたくない場合、 tkinterdnd2/TkinterDnD.pyファイルの_require関数内で、 読み込む対象のディレクトリを分岐してる処理があるので、その辺を変更します)
person

2020/10/07 00:06

tkdnd-2.9.2-windows-x86.zip をダウンロードして、C:\Users\USER\AppData\Local\Programs\Python\Python38-32\tcl に入れたtkdndフォルダと置き換えて tkinterdnd2-masterの直下に置いたdemo_canvas.pyをvscodeの再生ボタンから実行したらできました。 しかし、 cd desktop\tkinterdnd2-master pyinstaller -F -w demo_canvas.py --additional-hooks-dir=. としたら実行されず、stderrには Traceback (most recent call last): File "tkinterdnd2\TkinterDnD.py", line 53, in _require _tkinter.TclError: couldn't load library "C:\Users\USER\AppData\Local\Temp\_MEI143762\tkinterdnd2\tkdnd\win64/libtkdnd2.9.2.dll": Bad exe format. Possibly a 32/64-bit mismatch. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "demo_canvas.py", line 14, in <module> File "tkinterdnd2\TkinterDnD.py", line 285, in __init__ File "tkinterdnd2\TkinterDnD.py", line 55, in _require RuntimeError: Unable to load tkdnd library. とありました。
person

2020/10/07 00:12

エラーメッセージにある_MEI143762はTEMPフォルダの直下のものだからか exeを実行するたびに名称が変わるうえ、探しても見つかりません。
teamikl

2020/10/07 00:26

exe ファイルにはインストールされたものではなく、 プロジェクト下の dll が含まれてるようですね。 tkinterdnd2プロジェクト下で実行した場合、 import したモジュールのPATHが、Pythonをインストールしたディレクトリ以下ではなく カレントディレクトリ内のファイルになっている可能性が考えられます。 対策: tkinterdnd2-master フォルダ下にある dll も差し替えて見て下さい。 もしくは、別にプロジェクト用ディレクトリを作り、 そこに必要なhook-tkinterdnd2.pyファイルのみをコピー
person

2020/10/07 04:08 編集

> tkinterdnd2-master フォルダ下にある dll も差し替えて見て下さい。 C:\Users\USER\Desktop\tkinterdnd2-master\tkinterdnd2\tkdnd\win64\libtkdnd2.9.2.dll を差し替えるという解釈で合ってますか? これをtkdnd-2.9.2-windows-x86.zipのlibtkdnd2.9.2.dllに置き換えましたが、同じエラーが出ました。 > もしくは、別にプロジェクト用ディレクトリを作り、 > そこに必要なhook-tkinterdnd2.pyファイルのみをコピー tkinterdnd2-master直下にsrcフォルダを作成し、その中にtkinterdnd2フォルダとdemo_canvas.pyとhook-tkinterdnd2.pyをコピー。 cd desktop\tkinterdnd2-master\src pyinstaller -F -w demo_canvas.py --additional-hooks-dir=. としましたが、これも同様のエラーが出てしまいます。
teamikl

2020/10/07 04:50

> その中にtkinterdnd2フォルダと tkinterdnd2 フォルダのコピーは余分です。 カレントディレクトリ以下にあるファイルを読み込ませない為に、 別ディレクトリにしたいので。 ライブラリをinstall して使う場合と、 プロジェクトにコピーして使う方法で齟齬が出てそうですが、 プロジェクトにコピーするのは hook に呼び出すファイルのみです。 ライブラリ自体はinstall したものを参照します(dll を差し替えたのがインストール先のものの場合) >C:\Users\USER\Desktop\tkinterdnd2-master\tkinterdnd2\tkdnd\win64\libtkdnd2.9.2.dll を差し替えるという解釈で合ってますか? はい。 手順としては、 - master\tkinterdnd2\tkdnd\win64\libtkdnd2.9.2.dll を差し替える - tkinterdnd2をinstall - pyinstaller 実行 ---- dll が32ビット版なら正常に動いてるようなので、 意図通りの dll が読み込まれてないのは、 差し替えたのとは別のdllが読み込まれている為です。 pyinstaller を --onefile オプションなしで実行し 作成されるdist 以下のtclディレクトリにどちらのdllがあるか 確認して見て下さい。(ファイルサイズ等で判断)
person

2020/10/07 05:16

> カレントディレクトリ以下にあるファイルを読み込ませない為に、 別ディレクトリにしたいので。 import tkinterdnd2とあったのでtkinterdnd2フォルダがないとエラーになると思ったのですが、そうではないのですね。 tkinterdnd2フォルダを削除して、 cd desktop\tkinterdnd2-master\src pyinstaller -F -w demo_canvas.py --additional-hooks-dir=. をやり直しましたが、同様のエラーです。 > 手順としては、 > - master\tkinterdnd2\tkdnd\win64\libtkdnd2.9.2.dll を差し替える > - tkinterdnd2をinstall > - pyinstaller 実行 できました。 差し替え後にinstall(python setup.py install)してなかったからかもしれません。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問